You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

122 lines
8.9 KiB
Markdown

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

# 学习攻略 | 怎样学好软件工程?
你好,我是宝玉。
关于“什么是软件工程”和“为什么要学软件工程”,我在开篇词中已经简单介绍过了。总结来说:软件工程是软件行业知识体系的内核。无论你想走技术路线,还是转向做管理,想要走的更快更稳,那就绕不开软件工程。
在正式开始学习前,我们先来聊聊应该如何学习软件工程。你要先知道,软件工程学科的“知识树”结构是什么样的,才能更好地理解每个知识点和彼此间的联系。
## 软件工程知识架构全景图
首先你要明确,当我们谈软件工程学时,究竟在讲些什么呢?
在《软件工程——实践者的研究方法》这本经典软件工程教材中作者Roger S.Pressman画了一张图高度概括了整个软件工程的核心知识。
![](https://static001.geekbang.org/resource/image/5b/dc/5b3yy6642bace3928782e978de576fdc.jpg)
由图可见,“质量焦点”在最底层,这不难理解软件工程是为了应对软件危机诞生的学科,其目标就是为了要**聚焦于质量,构建和维护高质量的软件。**可以说,聚焦于质量就是软件工程的基石。
**那“过程”指的是什么呢?**
要构建高质量软件,则要解决软件过程中的混乱,将软件开发过程中的沟通、计划、建模、构建和部署等活动有效地组织起来。而软件过程,就是在软件项目的生命周期内,也就是软件从诞生到结束这期间,在开发与构建系统时要遵循的步骤。
有两种过程框架你一定经常听到,那就是瀑布模型和敏捷开发。这是在软件工程多年的发展中,逐步形成的两种主流的软件过程指导框架。
**那么,何为“方法”?**
方法是指在整个过程中,如何构建系统的方法学。比如说,如何分析用户需求;如何对产品进行测试验收;如何进行系统架构设计等。
**知道了过程,掌握了方法,那么具体落到操作层面,就会涉及到工具的使用。**
我们需要工具来辅助方法的执行提高效率。通过工具可以把一些手动的工作自动化比如自动化测试工具自动构建部署工具通过工具可以帮助把一些流程规范起来比如Bug跟踪、源代码管理还可以通过工具帮助提高编码效率比如各种编辑器IDE、各种高级语言。
如果现在再回头总结一下,软件工程的核心知识点,**就是围绕软件开发过程,产生的方法学和工具。**
你可以用一个简单的公式来理解软件工程,那就是:**软件工程=工具+方法+过程。**
根据这个公式,我将软件工程的知识结构做成了思维导图,方便你对知识点有更好地理解,高效学习。
![](https://static001.geekbang.org/resource/image/99/99/9926b79ecc91a4e664933c587f630199.jpg)
## 如何学习软件工程?
我给了你软件工程学的公式,也对软件工程有了更为全面的了解,看起来软件工程学很简单,但这些内容一下子要吃透也不容易。在开篇词中,我介绍了会从“道、术和器”三个维度去讲这个专栏,这其实对应了学习软件工程的四重境界。
**学习软件工程的四重境界**
**第一重:用器**
“器”就是工具,工具规则简单,上手就可以用,也很快就能看到效果。比如,原型设计工具可以帮助你确定需求,持续集成工具可以帮助你简化测试和部署的流程。对工具的学习是最为简单的,也是最基础的。
**第二重:学术**
“术”就是方法学会方法你就能应用方法去完成一个任务例如用需求分析的方法你去搞清楚用户想要什么用Scrum去组织项目开发过程。
掌握了术,甚至是可以脱离器的,例如你没用原型设计工具,你用纸和笔,用白板,一样可以去沟通确认需求。
**第三重:悟道**
“道”就是本源软件工程知识的核心思想和本质规律。就像敏捷开发本身并不是一种方法而是一套价值观和原则领悟了这个道就可以成为你在处理项目过程中各种问题决策的依据。道是可以产生术的你掌握了敏捷开发的道你就可以领悟出Scrum、极限编程这样的术。
**第四重: 传道**
当你能把复杂的知识通过浅显易懂的方式传授给别人,那就说明你对知识的领悟已经到了更高的境界。同时,教学也是最好的学习方式,通过传授别人知识,可以让你对知识本身有更深入的理解。
## 做中学和教中学
你可能会问,怎样学,才能到达以上这四重境界?我在做技术管理的工作中,经常要做一些培训的工作,在这过程中我总结了两套行之有效的方法:“做中学”和“教中学”。
![](https://static001.geekbang.org/resource/image/38/19/38203f9726c63858c230e1947768f019.jpg)
**“做中学”,是一种自下而上的学习方法,**通过实践,从使用工具到学习方法,再从方法中提炼出道。
在学习本专栏的时候,你可以采用“做中学”的方式,把专栏中的知识应用起来,在实践的过程中去巩固你学到的知识,去思考背后的道。把已经积累的项目经验和软件工程的知识点关联起来,这样才能加深你的理解,学以致用,把经验和知识转化为能力。
**“教中学”,是一种自上而下的学习方法,**通过教学,去进一步深入领会别人总结出来的道,去模仿推导方法,去学习如何使用工具。
比如,你学习完一篇专栏文章后,把学到的知识进行输出,写成微博或博客分享出去;在公司内部讲给你的同事们听等。在教学分享的过程中,去进一步深化吸收知识内容,构建你的知识体系。
**“做中学”和“教中学”,**这两种方法你可以配合起来使用。
## 参考书目
另外,在学习软件工程的过程中,我看过一些不错的相关书籍,在这里列个书单,供大家参考。
* 《构建之法》
作者邹欣是微软的研发总监,同时在多所高校进行了软件工程的教学实践,在此基础上对软件工程的各个知识点和技能要求进行了系统性整理,形成教材。也是对本专栏知识很好的补充。
* 《人月神话》
这是软件工程历史上的经典著作内容发人深省40年来一直畅销不衰里面的观点即使到现在也不过时。这本书即使你以前看过隔一段时间再翻看一遍可能都会有新的感悟。
* 《人件》
如果说《人月神话》关注“软件开发”本身,《人件》则关注软件开发中的“人”。作者指出知识型企业的核心是人,而不是技术。
* 《知行合一: 实现价值驱动的敏捷和精益开发》
作者丛斌有二十多年从事软件工程教学、咨询和研究的经验所以书写的特别接地气文章有很多真实案例对敏捷开发和CMMI都有很深入描述。
* 《软件工程——实践者的研究方法》
这是大部分高校采用的软件工程标准教材,可以作为一个参考。
* 《持续交付》
讲述如何实现更快、更可靠、低成本的自动化软件交付,描述了如何通过增加反馈,并改进开发人员、测试人员、运维人员和项目经理之间的协作来达到这个目标。
* 《走出软件作坊》
这本书生动的描述了国内小型IT企业在发展过程中遇到的一系列项目管理问题以及作者是如何去解决这些问题的。
## 总结
今天,我带你浏览了软件工程的全景图,也为你讲解了学习软件工程的四重境界。同时,我也介绍了“做中学”和“教中学”这两套行之有效,并且特别适合软件工程学科的学习方法,所以希望你在后面的学习中,可以付诸行动。
* **分享你学到的知识。**将你从专栏学习到的知识写成微博或博客等,分享给大家。写作是一种特别好的总结和学习方式,在你写的过程中,很多不清楚的问题就想明白了。
* **做几次内部分享或培训。**如果你从来没做过公司内部的分享或培训不妨迈出第一步把你学到的知识写成PPT小范围地讲给你的同事或朋友。如果你已经做过类似的分享那么就再做几次软件工程相关的。准备PPT的过程就是你最好的学习过程。
* **把你学习的知识应用起来。**学到的知识只有用起来才能变成你自己的经验,尝试着把在专栏中学到的知识应用到你的项目中去。多问多思考。有疑问就提出来;看到其他人问的问题,也可以去思考为什么,一起探讨问题的答案。
感谢阅读,如果你觉得这篇文章对你有一些启发,也欢迎把它分享给你的朋友。