软件值多少钱?

来源:互联网 发布:mac air 还是pro 编辑:程序博客网 时间:2024/04/19 09:42
  星期六下午一个朋友让我写一个小程序,说他核对数据很麻烦,要干三天而且容易出错,我听了他的要求,觉得容易,答应替他做一下。
  本来想着简单,可是真动起来却费劲,用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

 
0 0
原创粉丝点击