软件工程≠计算机科学
软件是“直接涉及人类活动的”, 而传统的计算机科学没有这个属性。计算机科学会关系与P和NP之间的巨大差异,而软件工程则侧重于对于给定的人类问题,在适当的时间内,合理的成本价,可以接受的错误bug来完成我们预期功能。人们日益增长的需求和日益出现的软件是并进的,其关注点在于满足人们的真实需求。有计算机科学的专业在前,软件工程在其之上给人们的需求得以满足,并且权衡各方面的成本。在后面人件的阅读后,感受会更加深刻。
大教堂和市集 + 有人负责,才有质量:写给在集市中迷失的一代
大教堂模式:由专属的团队负责开发,开发完成后开源后的软件。每个版本都由其控制。
市集模式:开发过程中,就把源码公开供人监视和共同开发。
作者认为,前者纠错的代价更大,后者”让更多人看到源码,bug将无所遁形“。
单是这些介绍其实不如有其他声音一起讨论,因此把后面这个和它放在了一起。后面这篇文章则认为,只有有人负责才有质量,市集模式的开发方式,导致代码无人负责,导致了为了解决问题而使用了没有设计好的流程和方式,存留了太多问题。这两种相比,我没有太多的体验因为没有参与过类似项目的开发或者是源码体验,不过这种思考和争辩感觉还是有意思的。
现代软件工程 习而学的软件工程教育
这种体验还是有一些想法的。比如现在如果让我用新的语言开始写代码,那么基本上就是拿过来直接写,把手册当作字典来查询,在开发的过程中学习。但是在大一大二转专业过来刚开始进行的时候,是特别痛苦的,因为没有编程基础,不知道什么是编写gui的方法,没有接触过面向对象,而老师就直接布置了作业,认为我们可以自学完成,但是就太痛苦了,完全应付不了,导致效果极差。我认为,在有了一定的基础和认识之后,习而学才是高效有用的。比如实习,我们都知道新人来后前面的一段时间会要别人教其学习,对公司带来的生产力是负数,如果起点太低,相信对每一方都是伤害。但是,在有一些基础后的习而学是高效的,我认为比学而习高效的多,但也应当有一些基础,或者同时进行,或者一开始的习而学不要起点太高。
What Should We Teach New Software Developers? Why?
计算机行业和软件工业界的gap带来的困扰,我作为一个半路出家没有代码基础的同学来说,感受还是很大的,可以说这个困扰伴随了整个大二大三,其实到现在也没有解决清楚。一开始,担忧我想要去工业界工作但是为什么课程的设置这么基础,为什么没有完成的大项目课程;担忧我要去科研,为什么实验室的引入和设计不放在大学的一开始或者大二大三,为什么不教大家科研都想学的深度学习的完整课程。为什么不教我们科研但是毕业开始申请了又要我们拿出来gpa和论文。然后觉得计算机科学专业是给那些真正有想法的人,那些对编程有兴趣的人,自己会探索各种技巧,完成很多项目;那些对科研感兴趣的,会在课余主动在实验室完成很多学习和实践。对于没有什么想法随波逐流的人来说,学习计算机科学而不是软件工程,我认为一定程度上是有负面影响的:想要培养科研人才却不督促完成,挑选出了优秀的适合科研的自学和有热情的人才,但是抛弃了后进同学于不顾。或许以后课改可以更加因材施教一些。
《人件》
人件读后能感觉到,真实地运营一个软件公司和自己设想中的运营、和运行一个作业项目小组,或者运行一个传统行业的差别都是很大的。软件公司以人才为核心生产力和生产资源,从人员的招聘、工作环境的维护、人员流失的代价、工作方式的衡量评估方法,都以人这一资源为核心围绕进行。软件公司里,人作为最核心的生产资源,有其独特性,每个人都不同,生产的进行无法像传统行业一样由机械或者其他生产资源决定其生产效率,而是人的自己的创造性为生产力,面对这样的很有弹性的核心生产资源,处理方法应当有所不同。其次是软件公司作为“高新技术”公司,无论是员工还是公司往往关注点会放在高新技术上,但是实际上对于大多数的普通软件公司来说,管理者的思考中心应当放在对人的管理上,因为“高新技术”是那些研究人员所创造的,普通的生产公司,对于人这一核心生产资源的重视才是最应该做的。
首先想谈一下使我有感触的小点。第一个就是“碎片化工作”的伤害了。如果一个员工要兼顾4个以上的项目,那么他就要承受4倍的人际互动,就等于把所有时间都花在角色切换上了。这个对我的触动太大了,以及后续的“没有人可以同时是多个有凝聚力团体的一员。紧密协作的凝聚力团体是排他的,碎片化的团队不可能形成凝聚力”。作为一个学生,我时常感受到往往只有一个工作在手头的时候,我可以进入浸入式的工作状态,效率非常高;而手头有多个工作时,不仅是切换的花费的无效时间、重新进入思考状态的时间令人烦恼,而且是有顾此失彼的事情时常发生。然后是“今天常见的模块式小隔间是各方妥协的经典之作,在没给你任何有意义的隐私的前提下,还让你感觉被隔开了。”忍不住想笑,确实是形容的很贴切。对于生活中习以为常的设施,没有想到它背后还蕴含了对于员工的“隐私”体验和上级对于工作状态的监管之间的角力妥协。然后是加班会破坏集体的团结,因为额外的时间的占用总会有人因为私人的原因无法参与,有些对大多数人自由灵活的时间安排对于某些人来说是固定无法参与的,长此以往会导致其他人感受到不公平而破坏掉凝聚力和团结性。
然后是聊一下这本书的核心内容带来的收获。首先是把人作为核心生产资源的认识,其次是对人这一特殊生产资源的高效利用需要有所思考。把人当作核心生产资源,一次两次的虚假deadline提高生产率会导致后续的懈怠;在工作环境的隐私和安静上的投入可以有更高的汇报;留不住人才,人员的交换和流失对于公司来说代价比想象中大得多;管理者应当以产出质量为衡量指标而非工作时长。对于人这一特殊生产资源的高效利用,不同于人在流水线上的工作,时间和产出成正比,程序员的产出只和他高效思考工作的“时间流“成正比。无效的工作时间有很多,加班占用了私下时间,往往会带来其正常工作时间的低效和做其他事,要让员工意识到完整的浸入式工作的重要性。要给小团队足够的自由,比如空间的安排和时间的安排,可以以最终的项目产出作为其是否高效工作的衡量方法。招聘新人的前一段时间带来的生产力是负数,但是对于人的投资是必须的;等等。