中国有句老话:三百六十行,行行出状元。每个行业都有佼佼者,而要做到行业翘楚,必须具有相应的职业素养。
成功的程序员在以往的工作和生活中都曾经历过大大小小的不确定性,承受过永无休止的压力。他们之所以能够成功,是因为拥有一个共同点,都深切关注开发软件所需的各项实践。他们将软件开发视为一种需要精雕细琢加以修炼的技艺,他们以专业人士的标准要求自己,他们具有职业素养。
世界级软件开发大师Robert C.Martin在书中对以下内容做出了解答:
- 成为真正的软件专业人士需要具备哪些条件,如何应对彼此冲突又紧张的进度表和不近人情的管理人员
- 如何做到流畅编程,克服阻塞状态
- 如何应对无休止的工作压力,避免崩溃
- 如何培养坚持不懈的态度,如何拥抱新的开发范式
- 如何管理好时间,避免身陷泥潭无法自拔
- 如何培育有利于程序员和开发团队茁壮成长的环境
- 什么时候应该说“不”,怎么说
- 什么时候应该说“是”,承诺意味着什么
一、成为专业的软件人士需要具备哪些条件?
你希望获得荣誉和骄傲吗?如果回答是,那首要前提,你必须做个专业人士。
专业人士和非专业人士面对某个模块里的一个bug,态度是迥然不同的。非专业人士可能会耸耸肩:“状况总是难免的嘛。”然后像没事儿人一样继续写下一个,哪怕这个bug给公司带来了损失。而专业人士会自己为公司那损失买单。
专业主义的精髓在于将公司利益视同个人利益,利益与共,它的代名词就是担当责任。
1、不行损害之事
如何担责呢?首先肯定是不能做坏事。那么问题来了,软件开发人员一般会做什么什么伤天害理的事情呢?
从纯软件角度,他可以破坏软件的功能和架构。那么,如何来避免带来这些破坏?
1)不要破坏软件功能
开发的软件有bug会损害软件的功能,但是代码中难免会出现bug,没人能写出完美的软件,但这并不表示你不用对不完美负责。
职业经验多了之后,你的失误率应该快速减少,甚至趋近于零。
- 让QA找不出任何问题:每次QA找出问题时,更糟糕的是用户找出问题时,你都该震惊羞愧,并决心以此为戒。
- 要确信代码正常运行:测试驱动开发(TDD)
- 自动化QA:接口自动化测试框架Fitnesse
2)不要破坏结构
成熟的专业开发人员知道,聪明人不会为了发布新功能而破坏结构。结构良好的代码更灵活。所有软件项目的根本指导原则是,软件要易于修改。
如果你希望自己的软件灵活多变,应该时常修改它!有一种策略叫“无情重构”:专业开发人员对自己的代码和测试极有把握,他们会极其疯狂随意地做各种修改。
2、有良好的职业道德
雇主出了钱,你必须付出时间和精力。
一周有168小时,给你的雇主40小时,为自己的职业发展留20小时,剩下的108小时再留56小时给睡眠,那么还剩52小时可做其他的事。
如果渴望成为专业开发者,那么在那20小时里,应该做能够激发、强化你热情的事,那20小时应该充满乐趣。
1)了解你的领域
“不能铭记过去的人,注定重蹈先人的覆辙。”
每个专业软件开发人员必须精通的事项:
- 设计模式。必须能描述GOF书中的全部24种模式,同时还要有POSA书中的多数模式的实战经验。
- 设计原则。必须了解SOLID原则,而且要深刻理解组件设计原则。
- 方法。必须理解XP、Scrum、精益、看板、瀑布、结构化分析及结构化设计等。
- 实践。必须掌握测试驱动开发、面向对象设计、结构化编程、持续集成和结对编程。
- 工件。必须了解如何使用UML图、DFD图、结构图、Petri网络图、状态迁移图表、流程图和决策表。
2)坚持学习
不懂就学,不畏艰难。
3)勤于练习
业精于勤荒于嬉,行成于思毁于随。
早晚都来个10分钟的卡塔(卡塔的形式往往是一个有待解决的简单编程问题,训练你的手指和大脑),把它当做热身练习或静心过程。
4)善于合作
专用的软件开发人员往往会更加努力地尝试与他人一起编程、一起练习、一起设计、一起计划,这样他们可以从彼此身上学到很多东西,而且能在更短时间内更高质量地完成更多工作。
5)多做辅导
想迅速牢固地掌握某些事实和观念,最好的方法就是与由你负责的人交流这些内容。
6)了解业务领域
每位专业软件开发人员都有义务了解自己开发的解决方案所对应的业务领域。
开始一个新领域的项目时,应当读一两本该领域相关的书,要就该领域的基础架构与基本知识做客户与用户访谈,还应当花时间和业内专家交流,了解他们的原则和价值观念。
7)与雇主/客户保持一致
雇主的问题就是你的问题,必须弄明白这些问题并寻求最佳的解决方案。
8)谦逊
二、如何做到流畅编程,克服阻塞状态?
有些时候,死活就是写不出代码来。
Bob大叔在书中提到了两种方法:结对编程以及创造性输入。
1、结对编程
和别人一起工作时,在大脑或身体中会发生一些化学变化,这种变化能帮我我们冲破阻塞继续前进。
2、创造性输入
创造性的输出依赖于创造性的输入,平时广泛阅读,激发创造力。
三、如何应对无休止的工作压力,避免崩溃?
应对压力的诀窍在于,能回避压力时尽可能地回避,当无法回避时勇敢直面压力。可以通过慎重承诺、遵循自己的纪律原则、保持整洁等来回避压力。直面压力时,这样保持冷静,与别人多多沟通,坚守自己的原则纪律,并寻求他人的帮助。
四、如何培养坚持不懈的态度,如何拥抱新的开发范式?
职业程序员通常会受到一种限制,即所解决的问题种类比较单一。老板通常只强调一种语言、一种平台,以及程序员的专门领域。经验不够丰富的程序员,履历和思维都存在某种贻害无穷的盲区。
保持不落伍的一种方法是为开源项目贡献代码,此外,还要用自己的时间来练习。
五、如何管理好时间,避免身陷泥潭无法自拔?
8小时其实非常短暂,只有480分钟,28800秒。身为专业开发人员,你肯定希望在这短暂的时间里尽可能高效工作,取得尽可能多的成果。有什么办法能确保不浪费这宝贵的时间呢?怎样才能有效地管理时间?
1、会议
关于会议,有两条真理:
- 会议是必须的
- 会议浪费了大量时间
专业开发人员要清楚会议的高昂成本,如果会议没有现实且显著的成效,要主动拒绝。
在这么多会议中,有2个会议很重要且务必参加。
1)立会
到场人依次回答以下三个问题:
- 我昨天干了什么?
- 我今天打算干什么?
- 我遇到了什么问题?
2)迭代计划会议
迭代计划会议用来选择在下一轮迭代中实现的开发任务。在会议召开前必须完成两项任务:评估可选择任务的开发时间,确定这些任务的业务价值。
会议的节奏应该很快,简明扼要地讨论各个候选任务,然后决定是选择还是放弃。会议在每个任务上所花的时间应该限制在5~10分钟。如果需要更详细的讨论,应当另选时间,挑出团队中第一部分人专门进行。
2、注意力点数
编程是需要持续投入精力和注意力的智力活动。如果你花光了自己的注意力点数,必须花一小时或更多的时间做不需要注意力的事情,来补充它。
3、要避免的行为
专业的开发人员要学会抵制优先级错乱,要敞开心扉听取其它解决方案;
不要执拗于某个无法放弃的方案,比如走不通的技术道路;
要时刻警惕正在显露的泥潭,一旦看清楚,就要避开,走回头路绝对是最简单的方法。
六、如何培育有利于程序员和开发团队茁壮成长的环境?
学校能够传授的是计算机编程的理论,但是学校并不会也无法传授作为一名编程匠者所需掌握的原则、实践和技能。这些东西只有经由师徒个体间多年的细心监督和辅导才能获得。
建立一种包含学徒期、实习期和长期指引的机制有利于开发团队的茁壮成长。
“工匠”一词包含有心智、技能和质量,它会在人们心中唤起“经验丰富”和“堪当重任”这样的印象。当资深人士向年轻学徒殷勤传授技艺,然后再在学徒之间互相传播的过程中,资深人士需要不断反思和改进传授之道,让大家都“感染”上这种技术魔因。
七、什么时候应该说“不”,怎么说?
能就是能,不能就是不能。不要说试试看。
花三分的力气去抵制无理需求,可以节省十分甚至二十分的开发时间。反之,自欺欺人地说服自己凑合接受了无理需求,往往会非常被动乃至无法脱身。
最要说“不”的是那些高风险时刻。越是关键时刻,“不”字就越具价值。有时候,获取正确决策的唯一途径,便是勇敢无畏地说出“不”字。
八、什么时候应该说“是”,承诺意味着什么?
技术人员经常太容易说“是”,我们也总能听到“是的,我懂你意思;是,我会做到;blabla…”。很多时候,往往是在没有明确目标和期限的情况下,就草率给出了确认的答复,而并不将其视为自己的一种承诺。
什么情况下应该对业务部门说“是”,说“是”意味着什么?Bob大叔在书中是这么解答的:
(说“是”时)你对自己将会做某件事做了清晰的事实陈述,而且还明确说了完成期限。那不是指别人,而是指你自己。你谈的是自己回去做的一项行动,而且,你不是“可能”去做,也不是“可能做到”,而是“会”做到。
作为一名程序开发者,如果只会迅速写代码,却不关心代码背后的意义,不能迅速判断、解决程序运行中的各种问题,不能自信满满地为自己交付的程序承担责任,注定与职业素养无缘。
本书是Bob大叔关于软件技艺主体的沉思,这些沉思并非是纯粹形而上的思辨推演,而是他对自身编程生涯的深刻反思和经验沉淀。
Professionalism,素养强调的并不是天赋的神秘,也不是技艺的高深,而是持续积淀的结晶。一方面,它体现了能力和素质;另一方面,它又强调了持续的积累和养成。
希望看完本书,大家都能了解和认识到开发人员的职业素养,做一名有素养的程序员。