参与软件开发的相关人员,虽然称为工程技术人员,但本质上其实就是手艺人。手艺嘛肯定是一技之长,里面多少有些门道,外行人做不了, 也很难完全搞清楚其中的门道,合作过程中就怕被坑上当 :-)。
“你工作量饱和吗?”,“团队工作量饱和吗?” 这个对很多同学来说,相信是灵魂一问。近来锅叔就也“又”被问到了。这个问题可以从很多个角度来讨论,现在因为是老板问,这里就试着主要从面向老板的角度来做一个回答。

一、 效率低可能是因为需求过于追求高端
“东西做的太慢,这点儿东西不应该2天搞定么, 为啥要10天”
房屋装修是一个比较贴近生活的例子,把房子从毛坯装成“地中海",其中是涉及到很多工序,工艺,材料的。不同的工艺,材料,不同的施工要求,对成本的影响是很大的。多数时候,使用什么样的工艺,材料是通过先确定预算后,反推而来的。
这体现了对于解决同一个“把房子装成地中海”的问题,是有很大的弹性空间的。如果遇到有钱的业主,表示不差钱,怎么好怎么来,那可能就会使用更好的材料,更复杂的工艺,以效果为主。如果遇到预算有限的业主,那可能就会推荐实惠的材料,比较易于施工的工艺,以价格为主。最终,豪装的地中海可能可以装同样面积的3套低配地中海。但,这显然不能说,豪装一套地中海的就是工作量不饱和。
把这个问题换成软件领域的“开发一个网络商城”或者完成“XXX功能”,情景其实是完全一样的。好看的,性能高的,功能模块多的,没有bug的,支持100w人同时秒杀的,需要投入的成本时间一定比,从网上找个开源的稍作修改甚至不改,要贵若干若干倍。如果预算有限,那可以先降低下要求,不必要一步做出个淘宝,够用就好。这样就可以缩小投资,缩短开发周期,剩下的时间可以做别的项目,工作效率就更“高”了。
作为领导者目标思路要定好说清,"怎么省钱怎么来"与 "怎么好怎么来",所得到的结果是不能单纯比较数量的。 比如如果对于一个功能的质量不怎么关心,那可以明确说。这个不重要,不需要规范测试, 能用就行。就可以省掉很多测试成本。如果对于用户体验要求不高,可以跟开发说怎么方便怎么做,不要追求交互和外观细节。
所以,做的多不等于工作量饱和,做得慢不等于不饱和,需要先明确标准和重点。
二、工作量饱和未必有益
花钱雇人多数情况下是希望他不要闲着的,但是也有很多例外的情况,典型的一类例外是“以备不时之需”。所谓养兵千日,用兵一时。
例如你雇佣了一名司机,他的工作职责应该是,在你需要出行的时候,安全驾驶把你带到目的地。这是你雇佣的目的,也是你的核心需求。你应该不会在你不需要他帮你开车的时候,因为怕他空下来,而安排他开车自己出去跑两圈,每天跑满8小时。
回到软件领域,如果你的公司模式主要是做项目外包,那每个开发人员都别闲着无疑是你应该追求的,越快的交付时间意味着越低的成本,对应着越高的利润。
而如果你的公司是在运营一个自己的产品,是否一直“饱和”就不再是问题的关键。你对研发的要求可能就变成,能不能及时响应的业务需求,有没有能力实现你的创意要求。因为通过拼命产出功能并不一定能带来对应的客户和业务增长。
反而为了让研发饱和,不用白不用,而拼命加一些可有可无的需求,却可能会伤害你的系统的用户体验,技术上让你的系统难于维护,对硬件的需求成本变高。
“知识产生于闲暇”,全都低头拉车,就难有人抬头看路了。
三、考核过程细节的风险
——“老板开始严抓考勤,卫生,着装,说明你的公司一定在走下坡路了”。多数人应该会觉得这样的说法在科技类的公司是有道理的,因为这些细节通常并不是影响你的业务做的多少的主要因素。如果公司订单都做不完,肯定没空顾得上这个,大家工作量也自动饱和。
管理者考核什么,那么通常就会得到什么,同时,有得必有失。如果你觉得大家工作不努力,考核大家的加班, 那最终就会得到加班统计上升。 但效率未必会提高,员工可能会想,反正也要加班的。把8小时的工作放到10个小时做好了。同时可能引起另外一些务实风格员工的不满,造成离职率提高,人员更替成本提高。
如果通过考核代码数量来考核效率,那么也一定会得到更高的人日代码产出。但模块复用率可能会降低,大家都倾向于自己发明轮子,系统的可维护性降低,最终变成屎山。
过程的因素很多,考核成本高昂,一般建议结果导向,如有没有如期交付, 用户是否满意,有没有赚到钱。同时也不建议考核到个人,最小粒度到团队应该就完全够用。过程和细节还是交给专业的管理人员去灵活把握,毕竟,管理还是以人为本的,这也是管理者的价值所在。
业务才是结果,雇1个人接了10个人的订单量, 工作量不会不饱和。
四、心理价位的确定
锅叔的职业经历,多数都是在做自运营产品类项目的开发。其间从团队层面得到的肯定,是很有限的。因为自运营的东西除了首次上线这个节点外,后续就是在不停的收集各方需求迭代。这其中开发效率和技能对是否能赚到钱的影响,就非常的不容易体现。因此,老板们对于开发团队的阶段效率质量就很难产生一个心理价位,通常只会在交付时间影响业务开展时,催促你抓紧时间,尽快上线,或者研发支出太多,就着手裁员。
研发的员工也是希望有一个反馈的,给点儿无论好坏的评价。而评价的基础就是目标,心理价位。
结合现实生活,“能不能再便宜点儿?”“您多钱想要?”。这其实就是体现了交易过程中,首先要确定的就是心理价位,而且确定方通常最后是买家,也就是老板们。作为买家不能永远要求卖家“再便宜点儿?”,如果能给出一个心理价位,就会显得诚意满满,其乐融融。
心理价位锚定了一个基准,卖家就知道,买的比这个价位低,那就是合作愉快。如果成本做不到这个价位, 那就会推荐你其他的商品或者解决方案, 也是以合作愉快为目的。
老板们可能会觉得,我不懂研发,我怎么知道多少算贵,多少算便宜。实际上生活中我们买多数东西,你都很难知道它的成本是多少,但最终还是成交了。
有了心理预期,才可能产生好坏的评价,才目标明确。
五、结语
当老板觉得大家工作量不饱和,通常就是两种情况。
1. 公司的业务收入有限,研发预算的投入占比太高,通俗说养不活研发。这时如果业务短时间没信心做起来,那只能以成本限制为主,裁一些人,需求从简,质量要求降低,开发周期拉长点,摊子别铺太大。
2. 感觉自己的研发不如别人家的研发,别人做的多快好省。可以直接提结果性的要求,如,这个必须什么时候上,必须生产上不能出大问题等。让专业的人去搞定过程细节,搞定了皆大欢喜,如果搞不定,就考察老板的洞察力了。是管理的不行,员工能力不行,还是别人忽悠你星球大战 ,需要老板们自行决断了。
我在从html页面生成PDF时遇到问题。我正在使用PDFkit。在安装它的过程中,我注意到我需要wkhtmltopdf。所以我也安装了它。我做了PDFkit的文档所说的一切......现在我在尝试加载PDF时遇到了这个错误。这里是错误:commandfailed:"/usr/local/bin/wkhtmltopdf""--margin-right""0.75in""--page-size""Letter""--margin-top""0.75in""--margin-bottom""0.75in""--encoding""UTF-8""--margin-left""0.75in""-
我在我的项目目录中完成了compasscreate.和compassinitrails。几个问题:我已将我的.sass文件放在public/stylesheets中。这是放置它们的正确位置吗?当我运行compasswatch时,它不会自动编译这些.sass文件。我必须手动指定文件:compasswatchpublic/stylesheets/myfile.sass等。如何让它自动运行?文件ie.css、print.css和screen.css已放在stylesheets/compiled。如何在编译后不让它们重新出现的情况下删除它们?我自己编译的.sass文件编译成compiled/t
我花了三天的时间用头撞墙,试图弄清楚为什么简单的“rake”不能通过我的规范文件。如果您遇到这种情况:任何文件夹路径中都不要有空格!。严重地。事实上,从现在开始,您命名的任何内容都没有空格。这是我的控制台输出:(在/Users/*****/Desktop/LearningRuby/learn_ruby)$rake/Users/*******/Desktop/LearningRuby/learn_ruby/00_hello/hello_spec.rb:116:in`require':cannotloadsuchfile--hello(LoadError) 最佳
关闭。这个问题需要detailsorclarity.它目前不接受答案。想改进这个问题吗?通过editingthispost添加细节并澄清问题.关闭8年前。Improvethisquestion在首页我有:汽车:VolvoSaabMercedesAudistatic_pages_spec.rb中的测试代码:it"shouldhavetherightselect"dovisithome_pathit{shouldhave_select('cars',:options=>['volvo','saab','mercedes','audi'])}end响应是rspec./spec/request
在Rails4.0.2中,我使用s3_direct_upload和aws-sdkgems直接为s3存储桶上传文件。在开发环境中它工作正常,但在生产环境中它会抛出如下错误,ActionView::Template::Error(noimplicitconversionofnilintoString)在View中,create_cv_url,:id=>"s3_uploader",:key=>"cv_uploads/{unique_id}/${filename}",:key_starts_with=>"cv_uploads/",:callback_param=>"cv[direct_uplo
使用Ruby1.9.2运行IDE提示说需要gemruby-debug-base19x并提供安装它。但是,在尝试安装它时会显示消息Failedtoinstallgems.Followinggemswerenotinstalled:C:/ProgramFiles(x86)/JetBrains/RubyMine3.2.4/rb/gems/ruby-debug-base19x-0.11.30.pre2.gem:Errorinstallingruby-debug-base19x-0.11.30.pre2.gem:The'linecache19'nativegemrequiresinstall
我知道全局变量$!包含最新的异常对象,但我对下面的语法感到困惑。谁能帮助我理解以下语法?rescue$! 最佳答案 此构造可防止异常停止您的程序并使堆栈跟踪冒泡。它还会将该异常作为值返回,这很有用。a=get_me_datarescue$!在此行之后,a将保存请求的数据或异常。然后您可以分析该异常并采取相应措施。defget_me_dataraise'Nodataforyou'enda=get_me_datarescue$!puts"Executioncarrieson"pa#>>Executioncarrieson#>>#更现实的
我在我正在处理的一些代码中发现了这一点。它旨在解决从磁盘读取key文件的要求。在生产环境中,key文件的内容位于环境变量中。旧代码:key=File.read('path/to/key.pem')新代码:key=File.read('|echo$KEY_VARIABLE')这是如何工作的? 最佳答案 来自IOdocs:Astringstartingwith“|”indicatesasubprocess.Theremainderofthestringfollowingthe“|”isinvokedasaprocesswithappro
我今天看到了一个ruby代码片段。[1,2,3,4,5,6,7].inject(:+)=>28[1,2,3,4,5,6,7].inject(:*)=>5040这里的注入(inject)和之前看到的完全不一样,比如[1,2,3,4,5,6,7].inject{|sum,x|sum+x}请解释一下它是如何工作的? 最佳答案 没有魔法,符号(方法)只是可能的参数之一。这是来自文档:#enum.inject(initial,sym)=>obj#enum.inject(sym)=>obj#enum.inject(initial){|mem
我刚刚有一个关于RubyonRails和模型(Rails3)中的attr_accessible属性的一般性问题。有人可以解释应该在那里定义哪些模型属性吗?我记得一些关于批量分配风险的事情,虽然我在这方面不太了解......谢谢:) 最佳答案 想象一个带有一些字段的订单类:Order.new({:type=>'Corn',:quantity=>6})现在假设订单也有折扣代码,比如:price_off。您不想将:price_off标记为attr_accessible。这会阻止恶意代码制作最终会执行如下操作的帖子:Order.new({: