专栏已经上线更新一段时间,看到同学们对软件工程有了更深刻的理解和思考,我很受感触。
有些人说走了很多弯路,日常搬砖,增删改查;也有的同学跟我一样“野路子”程序员出身,非常困惑希望建立自信;还有的同学发表上千字的学习心得,可以说非常用心。
编码的最终目的还是为了实现一整个软件的开发,在程序员的晋升之路上,总有单独挑大梁负责项目的时候。你会发现软件开发中的很多问题,都是可以通过软件工程的知识来解决的。
专栏已经上线更新一段时间,看到同学们对软件工程有了更深刻的理解和思考,我很受感触。
有些人说走了很多弯路,日常搬砖,增删改查;也有的同学跟我一样“野路子”程序员出身,非常困惑希望建立自信;还有的同学发表上千字的学习心得,可以说非常用心。
编码的最终目的还是为了实现一整个软件的开发,在程序员的晋升之路上,总有单独挑大梁负责项目的时候。你会发现软件开发中的很多问题,都是可以通过软件工程的知识来解决的。
在《从软件工程的角度解读任正非的新年公开信》这篇文章中,我已经提到了“软件项目管理金三角”的概念。由于这个内容对于软件工程来说,非常之重要,所以我今天特别展开再讲一下。
你会发现,在实际的软件项目中不乏这样的例子:
在上一篇文章中,我们一起看了一下大厂和敏捷相关的一些流程规范,同时也为你留了一道思考题:
如果每周一个Sprint,怎么保证每周都有交付,还能保证产品质量?
所以在这一篇中,我们就以每周一个Sprint的小项目组为例,看看它的日常是怎么应用敏捷开发的。
在我还是一个野路子程序员,到处接私活做网站时,就开始好奇:大厂都是怎么开发软件项目的?直到毕业后,我前前后后加入了若干大中小型企业,包括这些年在美国高校、公司的一些经历,对大厂的项目开发有了比较多的了解。
其实大厂做项目也没有什么特别的,无非就是工程中常见的“分而治之”的策略:大项目拆成小项目,大服务拆成小服务,大团队拆成小团队。
服务之间通过商定好的标准协议进行通信,架构上将大的服务拆分隔离成微服务,大团队按照业务或者服务拆分成小组,按照一定的流程规范保障协作。最终,各个小组要负责的内容其实就不多了。
关于敏捷开发的实际应用,现在无外乎有以下几种常见的情形:
在上一篇文章中,我重点介绍了瀑布模型。你现在知道了,瀑布模型简单易行,对于软件质量是有比较高保障的。但是瀑布模型对于前期需求不明确的项目,很难开展需求分析,后续如果有需求变更,瀑布模型便很难响应。
而且,每个软件项目的情况各不相同,都有自己的特点。比如说:
可以这么说:瀑布模型算是现代软件工程的起源,软件工程的发展,很大部分都是构建于瀑布模型的基础之上的。 我们后面所学的软件工程的很多内容,都是源自瀑布模型的衍生,或者其中某个阶段的细分。
我在上大学期间,还并不懂软件工程瀑布模型这些知识。当时我自学了点编程知识,然后开始在外面接点做网站的小活,开发模式非常简单,接到活直接写代码,有问题就改。这样下来居然也做了不少小网站,但是大一点的网站项目就搞不定了,甚至手头的小网站项目,找个同学帮忙都不知道大家该怎么分工。
所以当时我也很好奇,大的软件系统是如何开发出来的?那么多人一起开发一个软件,系统是如何分工协作的?
软件工程是一门用工程化方法解决软件项目问题的学科,其本质也是一门工程学科,这门课的知识在学完后,不仅可以应用在软件项目中,还可以应用于日常生活中遇到的一些问题,Everything is a project。
这句话对我影响很大。我真的开始在日常生活中尝试应用“Everything is a project”的概念,小到做作业,大到完成工作中的复杂项目。
解决这些问题的方式,就是参考软件生命周期和瀑布模型,把一件事情分成几个阶段:分析、设计、实施、测试、完成 ,然后制定相应的计划。这种方法不仅非常有效,让我的做事效率大幅提高,而且让我在看待事情上,能够更全面地、站在更高的角度去思考。
关于什么是软件工程和为什么要学软件工程,我在开篇词中已经简单介绍过了。总结来说:软件工程是软件行业知识体系的内核。无论你想走技术路线,还是转向做管理,想要走的更快更稳,那就绕不开软件工程。
在正式开始学习前,我们先来聊聊应该如何学习软件工程。你要先知道,软件工程学科的“知识树”结构是什么样的,才能更好地理解每个知识点和彼此间的联系。
软件工程知识架构全景图
2019年1月,任正非的那封《全面提升软件工程能力与实践,打造可信的高质量产品》公开信在朋友圈刷屏了。作为软件工程专业出身的程序员,这封公开信自然是引起了我的好奇,仔细阅读之下,确实让我大吃一惊。
于是,我从软件工程的角度对这封公开信进行了解读。在我们专栏内容正式更新前,我将它作为特别放送分享给你,希望可以帮助你更好地理解软件工程。
和很多人一样,我的职业生涯是从一个自学编程的“野路子”程序员开始的。1999年,我考入西北工业大学工程力学专业,但是却对编程很感兴趣。大一的时候自学网页编程,大二开始去学校网络中心兼职,同时在外面接了很多做网站的私活。
那时,虽然我的编程水平提升特别快,但是因为完全是自学,跟其他计算机科班的程序员一比,多少有点自卑感,觉得好像差点啥!在实际工作中,遇到具体的问题,我只能见招拆招,一个一个地解决。
当然,因为一开始我无法从系统层面整体看事情,所以虽然问题解决了,但也总有一种疲于奔命的感觉。我曾经遇到的问题,你肯定也不陌生,比如: