一本关于软件技艺主体的沉思,这些沉思非纯粹形而上的思辨,而是对自身编程深刻反思和经验沉淀。
【在过去工作中,遭遇过哪些令人印象深刻的困难,最后是如何解决?】
关键并不是问题的难度,面是解决问题的方式,步骤及反思的深度。如对于误删除的数据如何恢复,怎么分析问题,找了怎样的资料,采用什么步骤,以后如何避免以后出现此问题。相比问题的难度,更能体现一个人的职业素养。
素养强调的不是天赋,也不是技艺的高深,而是持续沉淀的结晶:一方面,它体现了能力和素质,另一方面强调持续积累和养成。
【什么情况下应该说“是”,“是”意味着什么】
专业主义
清楚你要什么
“专业主义”不但象征荣誉,而且意味着责任与义务。
担当责任
为不负责任尝尽苦头,才明白尽职尽责的重要意义。
未对“例程”进行测试就交付软件是不负责任的。
首先,不做损害之事
我们该如何承担责任呢?做为一名有专业和抱负的专业人士,他的首要责任与目标尽其所能行有效之事。软件开发人员能做什么坏事呢?从纯软件角度,他可能破坏软件的整体功能与架构。
1、不要破坏软件的功能:要对自己的不完美负责,代码验免出现Bug,但不意味着不用对他们负责任。所谓专业人士,就是对自己犯下的错误负责的人,哪怕错误在所难免。所以要练习的第一件事就是“道歉”,道歉是必需的。你不能一而再、再而三犯相同的错误。职业经验多了之后,你的失误率快速减少,渐近于零。
(1)让QA找不出任何问题:把自己没把握(缺陷)的代码发送给QA是极其不专业的。
(2)要确信代码正确运行:你怎么保证代码正确运行?测试,反复测试
(3)自动化QA:
2、不要破坏结构:所有项目根本原则是,软件要易于修改。
职业道德
1、了解你的领域:
【必须精通的事项】
(1)设计模式:必须能描述GoF书中的全部24种模式
(2)设计原则:必须知晓SOLID
(3)方法:必须理解极限编程、Scrum、精益、看板、瀑布、结构化分析和结构化设计。
(4)实践:必须掌握测试驱动开发、面向对象设计、结构化编程、持续集成和结对编程。
(5)工件:必须知道如何使用UML、DFD数据流图、结构图、Petri网络图、状态转换图表、流程图和决策树。
2、坚持学习:广泛的学习才不至于落伍,新语言、原则和技术。
3、练习:真正的专业人士往往需要勤学苦练,以求自身技能的纯熟精练。
4、合作:彼此学习
5、辅导:迅速牢固掌握某些事实和观念,最好的方法是交流。
6、了解业务领域:
7、谦逊:我们从混沌中创造秩序,自信的发出各种准确无误指令
说“不”
因为敢说“不”的人,才能真正做一些事情。
对抗角色
竭尽所能地去追求和捍卫自己的目标,
高风险时刻
越是关键时刻“不”字越具价值。
要有团队精神
具备团队精神,意味恪尽职守,当其他队员遇到困难时你要援手相助。
1、试试看:如果你此前并未有所保留,如果你没有新方案,如果你不会改变你的行为,如果你对自己的估计有充分的自信,那么,从本质上讲,承诺“尝试”是一种不诚实的表现。你在说谎,你这么做的原因,可能是为了保住面子和避免冲突。
2、消极对抗:
说“是”的成本
客户所需要的任何一项功能,一旦写起来,总比刚开始说的复杂许多。
客户总会把项目的截止日期往后拖延,他们总想要更多的功能,总是提出需求变更。
【客户及管理层知道如何让开发人员快速的写出代码方法】
(1)告诉他这个应用很简单
(2)挑剔指责开发团队没有发现他们的需要,并借机添加各种功能。
(3)一而再的推后项目的截止日期。
在经济全球化的时代,企业唯利是图,种种缩减开发成本的手段,已经消除高质量程序存在的价值和时宜。开发人员常常被要求、指示或欺骗花费一半的时间写出两倍的代码。
如何写出好代码
在冒险的游戏中,每个人都是输家。大家之所以失败,是因为缺乏专业精神。
有时接受某些决定才是失败的根源。
说“是”
承诺用语
有时我们会轻易相信他人说到做到,但事实上并没有像承诺那样去做,不要轻易相信某些承诺。
1、识别缺乏“承诺”的征兆:
在承诺做某事时,应当留意自己的用词,因为这些词透露我们对承诺的认真程度。
【“缺乏承诺”的蛛丝马迹】
(1)需要/应当:“我们需要把这活做完”。“有人应当去推动这件事情”。
(2)希望/但愿:“希望明天我能完成这个任务”。“但愿有时间做这件事情”
(3)让我们(而不是“我):证我们把这件事完成
此类词常出现自己、别人身边,你会发现我们有极力逃避承担责任的倾向。如果相信此类承诺,大事不妙。
2、真正的承诺听起来是怎样的:
识别真正的承诺,搜寻相似语句:我将在....之前...(例:我将在周二前完成)。这句话的关键有于,对自己做的某件事做了清蜥的事实陈述,而且还说明了期限。
【没有做到”言必信,信必果“的一些原因,及应付方法】
(1)之所以未成功,是我寄于某某去做这些事情:你只能承诺你能掌控制的事。如果依赖他人,将无法承诺。
(2)之所以未成功,是因为我不太确信是否真能完成得了:既使目标无法完成,你仍将全力前进,离目标更近些。确认目标是否达成这件事,便是你可以采取的行动之一。
(3)之所以未成功,是因为有时候我真的无能为力:尽早告诉别人,否则错失了让他们帮助你达成目标,兑现承诺的机会。
学会如何说”是“
1、”试试“的另一面:
2、坚守原则:坚守原则的情况下,说是。
结论:
专业人士不需要对所有回答都说”是“,不过,应当努力寻找创新的方法,尽能能做到有求必应。
编码
要精熟掌握每项技艺,关键要具备”信心“和”出错感知“能力。
做好准备
【编码需平衡各种因素】
(1)代码必须能够正常工作:
(2)代码必须解决客户提供的问题:
(3)代码需和现有系统结合无缝:你的代码不能让系统更加僵便,管理各种依赖关系
(4)方便其它程序员阅读:
1、凌晨3点写出的代码:
代码会回头一遍遍肆虐我们,它制定一种错误的设计结构,每个人都要用到它,但又不得不拐弯抺角用才行。
2、焦虑时写下的代码:
将时间分块的方法,解决此问题。
流态区
高效率的状态,称为”流态“。编写代码时进入一种意识高度专注但思维视野却会收拢到狭窄的状态。
1、音乐:听音乐消耗脑力资源。
2、中断:
阻塞
1、创造性的输入:广泛的阅读,有助于提高创造力。
调试
是否能将调试时间降到最低。
保持节奏
1、知道何时应该离开一会:创造力和智力来自于大脑的高速运转。当遇到困难或感到疲劳时离开一会儿,让富有创造力的潜意识接管问题。了解创造力和智力的运行模式,充分发挥他们的优势而非与之背道而驰。
进度延迟
管理延迟的决窍,在于早期检测和保持透明。要根据目标定期衡量进度,使用三个考虑到多个因素的期限:乐观预估、标准预估、悲观预估。
1、期望:
2、盲目冲刺:
3、加班加点:
4、交付失误:
帮助
1、帮助他人:全情投入,收获的比给予的要多
2、接受他人帮助:
测试驱动开发TDD
TDD的三项原则
1、在编写好失败测试代码前,不要编写任何产品代码。
2、只要一个单元测试失败了,就不要再写测试代码,无法编译也是一种失败情况。
3、产品代码恰好能让失败测试代码通过,不可多写。
TDD优势
1、确定性:一旦修改代码,执行测试
2、缺陷注入率:
练习
引子
1、代码语句本质没有随时间而改变:
2、转变:任何事情,要做得快,都离不开练习。尽可能重复编码/测试过程,要求你迅速做出决定。这需要识别各种各样的环境和问题,并懂得应付。选择一系列的问题及其解决方案,一而再的练习,直到烂熟于心。
自身经验的拓展
职业通常会受到一种限制,所解决的问题比较单一。如一种语言、平台及程序员的专门领域。经验不够的,思维中存在盲区。
1、开源:
2、练习:其它语言、平台
验收测试
即要做好开发,也要做好沟通
需求的沟通
业务方描述自己的需求,程序员按自己理解业务方的需求来开发。
1、过早精细化: 双方都贪求不现实的精确性
(1)不确定原则:业务方一看到已经满足需求,关于到底要什么,他们有更好的想法。工作中有一种现象叫观察者效应(或不确定原则),每次你向业务方展示一项功能,他们获得比之前更多的信息, 这些信息反过来会影响他们对系统的看法。
(2)预估焦虑:即使拥有全面准确的信息,评估通常存在很大变数。需求会变,追求精确性是无劳的。了解其中误差值。
(3)迟来的模糊性:
时间管理
注意力点数
编程是精力和注意力的智力活动。注意力是稀缺资源,会随时间流逝而减少。忧虑和分神也会消耗注意力。
1、睡眠:
2、恢复:不集中注意力可以恢复注意力。
3、肌肉注意力:有助于改善心智注意力。
时间拆分和番茄工作法
每个番茄时间25钟内避免别人打扰,每次休息5分钟。完成4个番茄时间,休息30分钟。
死胡同
选择走不通的技术,越坚持,浪费时间越多。走回头路。如果你掉进坑里,别挖。
泥潭
如果发现在需求的变化上跟不上节奏,这就是转折点,你可以回头修正设计。走回头路看起来代价高昂,因为把已经有代码推翻重来,但走回头路绝对是最简单的方法。如果继续前进,系统可能陷入泥潭,永远无法脱身。
预估
预估是最简单,也是最可怕的活动之一。
什么是预估
1、承诺:不要随便承诺,除非他们确切知道何时完成。
2、预估:预估的偏差总是很大,预估不是一个定数,而是一种概率分布。
3、暗示性承诺:
压力
即使有压力,专业开发人员也会冷静果断。尽管压力不断增大,他仍然会坚守所受的训练和纪律,他知道这些是他赖以占胜由最后期限和承诺所带来压力感的最好方法。
嘲笑自己愚蠢荒唐,嘲笑自己承担所谓的压力,把自己和别人都弄得痛苦不堪的可怜家伙,这一切又图啥?通过卓越而非愚蠢的工作方式享受自己的职业生涯。
避免压力
在压力下保持冷静的最好方式,便是规避会导致压力的处境。
1、承诺:业务方总期望拿到承诺,因为他们想消除风险。我们要做的是使风险定量化并将他们陈述给业务方,这样方便他们做准备。
2、保持整洁:让系统、代码和设计尽可能整洁,就可以避免压力。
3、危机中的纪律:观察自己在危机中的反应,就可以了解自己的信念。如果在危机中依然遵守纪律,说明你相信纪律,反之依然。遵守纪律是避逸陷入危机最好办法。当困境来临,也不要改变行为。如果你遵守的纪律是工作的最好方式,那么在深度危机中,也要秉持这些原则。
应对压力
1、不要惊慌失措:放松下来,对问题深思熟虑,努力寻找可以带来好结果的最好途经,然后按照路经以合理稳定的节奏前进。
2、沟通:让你的团队和上级知道你陷入困境,告诉他们你制定走出困境的最佳方法,请求支援和指引。
3、依靠你的纪律原则:坚信你的纪律原则(已经知道切实有效),他可以帮你渡过高压时期,不是质疑和无端放弃他们。
协作
程序员与人
1、程序员与雇主:
把精力放在老板所追求的目标上。专业程序员首要职责是满足雇主的需求。和团队很好的协作,深刻理解业务目标,理解编写代码的业务价值是什么,企业从你工作中获取回报。专业程序员最糟糕的表现是是两耳不闻窗外事,只埋在自己的技术里,不关心公司业务。专业程序员花时间去理解业务,和用户讨论他们使用的软件,和销售与市场人员讨论遭遇的问题,和经理们沟通,明确团队的短期和长期目标。
2、程序员与程序员:
(1)代码个体所有:不正常的是每个程序员在自己代码周围筑起高墙。
(2)协作性的代码共有权:整个团队拥有所有代码。
(3)结对:
团队与项目
【小项目如何实施?如何给程序员分派?大项目如何实施】
只是简单混合吗
团队成员不是简单的混合起来就可行
1、有凝聚力的团队:团队成员首先建立关系,需要学习互相协作,了解彼此爱好、强弱最终才能形成凝聚团队。有凝聚力的团队12人左右。
(1)发酵期:克服个体差异,彼此配合,是需要一段时间(6个月左右)。
(2)团队和项目,何者优先:围绕项目构建团队是愚蠢的,因为无法形成凝聚力。一个有凝聚力的团队能同时接多个项目,根据成员意愿,技能和能力分配工作,会顺利完成。
2、如何管理有凝聚力团队:每个团队都有速度,在一定的时间内完成工作量。速度是一种统计性的度量。管理人员可以给团队项目设计一个目标值。
网友评论