软件值多少钱?

  星期六下午一个朋友让我写一个小程序,说他核对数据很麻烦,要干三天而且容易出错,我听了他的要求,觉得容易,答应替他做一下。

  本来想着简单,可是真动起来却费劲,用VBA整整花了6个小时。

  交给他,10秒之内完成所有的工作,他很兴奋,对我说:“太好了,请你吃饭!”

  我开玩笑地说:“LZ忙活了那么长时间,你就一顿饭就打发了!唉!”

  “那还咋地?不就一个小程序嘛,你一会儿就搞定了,还想咋样?!”他以为不过尔尔。

  我说:“没有啦,给你开个玩笑。”,朋友帮忙怎么会要钱呢?!我想知道在他心里,这个活的价值所在。

  回来后我想想这些年的经历,从没有想过如何定义一个软件的价值和价格,给别人写程序,也是别人给多少拿多少,可是就很多人来说,他们心目中估计从来没有估量过一个软件真正的价值所在,更不会体谅一个程序员的辛苦。

  衡量我那6个小时的价格,如果按那个朋友工作三天来算,一天他的工资应该有200多元,3天就是600多元,这个工作他每年都做,就按3年算也是1800元〖前提:我帮助他持续改进,这个我肯定会做。〗,核心的问题是我帮助他提高了工作效率和效益,这隐形的价值没有办法估算。

  星期一给儿子报名,老师听说我是搞IT的,让我帮忙写一个分班程序,学校每年分班都要忙活好一阵子,我想都没有想就答应了,问我多少钱?我赶紧说不要钱。

  后来问我能否写一个排课表程序,问到价格,估计不超过2000元而且还犯难,我就婉拒了,因为听了她们的需求挺复杂,真要动手写并不容易,算法复杂,短时间难搞定。小春去年让我写一个类似的程序,给1万我也没有答应。

  回来我就琢磨分班程序,星期一晚上睡前也没有想到好方法,吃了根雪糕后,似乎想好了。

  星期二晚上过来写,准备开始时觉得前面的想法有问题,不行!
  星期三早晨起床仔细一想,找到了好方法。  

  想明白算法后,这个小程序写起来很快,可是前后思考的功夫却多了去,最后还做了个包装界面,哪怕一个小程序也折磨人啊!

  在我心目中,做诸如管理系统、数据库应用、没有根值入系统核心的工具等软件的都不算有真正有技术含量的活儿,只有在操作系统底层动心思折腾出开发平台类并且应用纯C++的软件才称得上真正意义的开发,我始终认为:做一般的应用系统、使用目前流行工具如C#、Java或其他语言对于一般人经过学习都可以胜任,这和其他工种没有本质区别,可能明显的区别在于软件开发这个行当里,需要更多的积累、打磨、沉浸和不断地与时俱进的继承和扬弃。
  所以,在我内心也就从没有认为我是程序员,做的东西很多但谈不上价值,没有价值的东西谈什么价格?!
  希望有一天,有个轻松的心态做个象样的、有价值的开发,这样到老了,咱也就无愧地认为自己当过程序员了。



  PS:分班程序要求很简单,就是给定学生总数、分班数和每班最多人数后进行分班,要求每个班的男生和女生以及年龄(按月)要求平均。
 

Dim LoopCount As Integer '临时计数

Dim IALL As Integer      '学生总数

Dim ClassCurNum(8) As Integer  '记录当前班级学生数

Dim INumOfPerClass As Integer   '每个班级的人数

Dim DtStart As Date  '开始时间

Dim DtEnd As Date    '结束时间

Dim IClassCount As Integer   '班级数



'Option Base 1

Sub 初始化()

'分7个班

IClassCount = 7

'每班最多50个学生

INumOfPerClass = 50

'学生总数

IALL = 305

'开始时间

DtStart = CDate("2006/9/1")

'结束时间

DtEnd = CDate("2008/8/31")

'计数清零

ClassCurNum(1) = 0

ClassCurNum(2) = 0

ClassCurNum(3) = 0

ClassCurNum(4) = 0

ClassCurNum(5) = 0

ClassCurNum(6) = 0

ClassCurNum(7) = 0

End Sub



Sub 分班()

Dim DtTemp As Date

Dim DtMax As Date

Dim DtMin As Date

Dim IYear As Integer

Dim IMonth As Integer

Dim Rng As Range



'初始化

DtTemp = DtStart

LoopCount = 1

Do While DtTemp < DtEnd

   '取时间范围

   IYear = Year(DtTemp)

   IMonth = Month(DtTemp)

   If IMonth = 12 Then

      DtMin = CDate(Trim(Str(IYear)) + "/12/1")

      DtMax = CDate(Trim(Str(IYear + 1)) + "/1/1")

   Else

      DtMin = CDate(Trim(Str(IYear)) + "/" + Str(IMonth) + "/1")

      DtMax = CDate(Trim(Str(IYear)) + "/" + Str(IMonth + 1) + "/1")

   End If

   '搜索

    With Sheet1

        For Each Rng In .Range("E2:E" + Trim(Str(IALL)))

            If CDate(Trim(Rng.Text)) >= DtMin And CDate(Trim(Rng.Text)) < DtMax Then

                .Range("F" + Trim(Str(Rng.Rows.Row))) = Str(GetClassNo)

            End If

        Next

    End With

   '准备分配下一个月

   IMonth = IMonth + 1

   If IMonth = 13 Then

      IMonth = 1

      IYear = IYear + 1

   End If

   DtTemp = CDate(Str(IYear) + "/" + Str(IMonth) + "/1")

Loop

MsgBox "分班完毕!"

End Sub



Function GetClassNo()

    If ClassCurNum(LoopCount) < INumOfPerClass Then

       GetClassNo = LoopCount

       ClassCurNum(LoopCount) = ClassCurNum(LoopCount) + 1

       '准备下一个取班级号

       LoopCount = LoopCount + 1

       If LoopCount > IClassCount Then

          LoopCount = 1

       End If 

    Else

       '学生已经满了

       '准备下一个取班级号

       LoopCount = LoopCount + 1

       If LoopCount > IClassCount Then

          LoopCount = 1

       End If
       '需要保证递归不溢出 

       GetClassNo = GetClassNo

    End If

End Function



Sub 统计分班结果()

Dim DtTemp As Date

Dim DtMax As Date

Dim DtMin As Date

Dim IYear As Integer

Dim IMonth As Integer

Dim IRowNo As Integer



初始化

DtTemp = DtStart

IRowNo = 4

Do While DtTemp < DtEnd

   IYear = Year(DtTemp)

   IMonth = Month(DtTemp)

    With Sheet2

         .Range("C" + Trim(Str(IRowNo))) = Statistics(1, "男", IYear, IMonth)

         .Range("D" + Trim(Str(IRowNo))) = Statistics(1, "女", IYear, IMonth)

         .Range("E" + Trim(Str(IRowNo))) = Statistics(2, "男", IYear, IMonth)

         .Range("F" + Trim(Str(IRowNo))) = Statistics(2, "女", IYear, IMonth)

         .Range("G" + Trim(Str(IRowNo))) = Statistics(3, "男", IYear, IMonth)

         .Range("H" + Trim(Str(IRowNo))) = Statistics(3, "女", IYear, IMonth)

         .Range("I" + Trim(Str(IRowNo))) = Statistics(4, "男", IYear, IMonth)

         .Range("J" + Trim(Str(IRowNo))) = Statistics(4, "女", IYear, IMonth)

         .Range("K" + Trim(Str(IRowNo))) = Statistics(5, "男", IYear, IMonth)

         .Range("L" + Trim(Str(IRowNo))) = Statistics(5, "女", IYear, IMonth)

         .Range("M" + Trim(Str(IRowNo))) = Statistics(6, "男", IYear, IMonth)

         .Range("N" + Trim(Str(IRowNo))) = Statistics(6, "女", IYear, IMonth)

         .Range("O" + Trim(Str(IRowNo))) = Statistics(7, "男", IYear, IMonth)

         .Range("P" + Trim(Str(IRowNo))) = Statistics(7, "女", IYear, IMonth)

    End With

   

   IRowNo = IRowNo + 1

   IMonth = IMonth + 1

   If IMonth = 13 Then

      IMonth = 1

      IYear = IYear + 1

   End If

   DtTemp = CDate(Str(IYear) + "/" + Str(IMonth) + "/1")

Loop

MsgBox "统计完毕!"

End Sub



Function Statistics(ClassNo As Integer, Xb As String, IYear As Integer, IMonth As Integer)

    Sheets("sheet1").Select

    Dim ICount As Integer

    With Sheet1

        For Each Rng In .Range("C2:C" + Trim(Str(IALL)))

            If Trim(Rng.Text) = Xb And CInt(Range("F" & Trim(Str(Rng.Rows.Row)))) = ClassNo And Month(Range("E" & Trim(Str(Rng.Rows.Row)))) = IMonth And Year(Range("E" & Trim(Str(Rng.Rows.Row)))) = IYear Then

               ICount = ICount + 1

            End If

        Next

    End With  

   Sheets("sheet2").Select

   Statistics = ICount

End Function



'为了保证分配的平衡,又采取了另外的方法,就是前后交叉分配,效果比前面的分配方法好一些,其实如果一直将PSP设置为True就是前面的分配方法,还可以用随机的方法来做,这个也简单,可以交差了太晚了不想折腾了,后面想到更好的再动手:

'初始化月份

SMonths = "200609200610200611200612200701200702200703200704200705200706200707200708200709200710200711200712200801200802200803200804200805200806200807200808"

PSP = True


Sub 分班_1()

Dim DtTemp As Date

Dim DtMax As Date

Dim DtMin As Date

Dim IYear As Integer

Dim IMonth As Integer

Dim Rng As Range

Dim STemp As String

'初始化

LoopCount = 1

Do While SMonths <> ""

    

   '取时间范围

   If PSP Then

      STemp = Left(SMonths, 6)

      SMonths = Right(SMonths, Len(SMonths) - 6)

   Else

      STemp = Right(SMonths, 6)

      SMonths = Left(SMonths, Len(SMonths) - 6)

   End If

      

   IYear = CInt(Left(STemp, 4))

   IMonth = CInt(Right(STemp, 2))

   If IMonth = 12 Then

      DtMin = CDate(Trim(Str(IYear)) + "/12/1")

      DtMax = CDate(Trim(Str(IYear + 1)) + "/1/1")

   Else

      DtMin = CDate(Trim(Str(IYear)) + "/" + Str(IMonth) + "/1")

      DtMax = CDate(Trim(Str(IYear)) + "/" + Str(IMonth + 1) + "/1")

   End If

   

   '搜索

    With Sheet1

        For Each Rng In .Range("E2:E" + Trim(Str(IALL)))

            If CDate(Trim(Rng.Text)) >= DtMin And CDate(Trim(Rng.Text)) < DtMax Then

                .Range("F" + Trim(Str(Rng.Rows.Row))) = Str(GetClassNo)

            End If

        Next

    End With

   '准备分配下一个月

   PSP = Not PSP

Loop

MsgBox "分班完毕!" + SMonths

End Sub



 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值