软件工程之美
宝玉
Groupon资深工程师,微软最有价值专家
立即订阅
6660 人已学习
课程目录
已完结 54 讲
0/4登录后,你可以任选4讲全文学习。
课前必读 (3讲)
开篇词 | 你为什么应该学好软件工程?
免费
特别放送 | 从软件工程的角度解读任正非的新年公开信
学习攻略 | 怎样学好软件工程?
基础理论 (9讲)
01 | 到底应该怎样理解软件工程?
02 | 工程思维:把每件事都当作一个项目来推进
03 | 瀑布模型:像工厂流水线一样把软件开发分层化
04 | 瀑布模型之外,还有哪些开发模型?
05 | 敏捷开发到底是想解决什么问题?
06 | 大厂都在用哪些敏捷方法?(上)
07 | 大厂都在用哪些敏捷方法?(下)
08 | 怎样平衡软件质量与时间成本范围的关系?
“一问一答”第1期 | 30个软件开发常见问题解决策略
项目规划篇 (8讲)
09 | 为什么软件工程项目普遍不重视可行性分析?
10 | 如果你想技术转管理,先来试试管好一个项目
11 | 项目计划:代码未动,计划先行
12 | 流程和规范:红绿灯不是约束,而是用来提高效率
13 | 白天开会,加班写代码的节奏怎么破?
14 | 项目管理工具:一切管理问题,都应思考能否通过工具解决
15 | 风险管理:不能盲目乐观,凡事都应该有B计划
16 | 怎样才能写好项目文档?
需求分析篇 (5讲)
17 | 需求分析到底要分析什么?怎么分析?
18 | 原型设计:如何用最小的代价完成产品特性?
19 | 作为程序员,你应该有产品意识
20 | 如何应对让人头疼的需求变更问题?
“一问一答”第2期 | 30个软件开发常见问题解决策略
系统设计篇 (4讲)
21 | 架构设计:普通程序员也能实现复杂系统?
22 | 如何为项目做好技术选型?
23 | 架构师:不想当架构师的程序员不是好程序员
24 | 技术债务:是继续修修补补凑合着用,还是推翻重来?
开发编码篇 (7讲)
25 | 有哪些方法可以提高开发效率?
26 | 持续交付:如何做到随时发布新版本到生产环境?
27 | 软件工程师的核心竞争力是什么?(上)
28 | 软件工程师的核心竞争力是什么?(下)
29 | 自动化测试:如何把Bug杀死在摇篮里?
30 | 用好源代码管理工具,让你的协作更高效
“一问一答”第3期 | 18个软件开发常见问题解决策略
软件测试篇 (4讲)
31 | 软件测试要为产品质量负责吗?
32 | 软件测试:什么样的公司需要专职测试?
33 | 测试工具:为什么不应该通过QQ/微信/邮件报Bug?
34 | 账号密码泄漏成灾,应该怎样预防?
运行维护篇 (6讲)
35 | 版本发布:软件上线只是新的开始
36 | DevOps工程师到底要做什么事情?
37 | 遇到线上故障,你和高手的差距在哪里?
38 | 日志管理:如何借助工具快速发现和定位产品问题 ?
39 | 项目总结:做好项目复盘,把经验变成能力
“一问一答”第4期 | 14个软件开发常见问题解决策略
经典案例解析篇 (7讲)
40 | 最佳实践:小团队如何应用软件工程?
41 | 为什么程序员的业余项目大多都死了?
42 | 反面案例:盘点那些失败的软件项目
43 | 以VS Code为例,看大型开源项目是如何应用软件工程的?
44 | 微软、谷歌、阿里巴巴等大厂是怎样应用软件工程的?
45 | 从软件工程的角度看微服务、云计算、人工智能这些新技术
“一问一答”第5期(内含彩蛋) | 22个软件开发常见问题解决策略
结束语 (1讲)
结束语 | 万事皆项目,软件工程无处不在
软件工程之美
登录|注册

开篇词 | 你为什么应该学好软件工程?

宝玉 2019-02-18
00:00
14:21
讲述:宝玉 大小:13.15M
你好,我是宝玉,欢迎加入我的专栏,和我一起开始软件工程的学习之旅。
和很多人一样,我的职业生涯是从一个自学编程的“野路子”程序员开始的。1999 年,我考入西北工业大学工程力学专业,但是却对编程很感兴趣。大一的时候自学网页编程,大二开始去学校网络中心兼职,同时在外面接了很多做网站的私活。
那时,虽然我的编程水平提升特别快,但是因为完全是自学,跟其他计算机科班的程序员一比,多少有点自卑感,觉得好像差点啥!在实际工作中,遇到具体的问题,我只能见招拆招,一个一个地解决。
当然,因为一开始我无法从系统层面整体看事情,所以虽然问题解决了,但也总有一种疲于奔命的感觉。我曾经遇到的问题,你肯定也不陌生,比如:
开发时没有分析没有设计,上手就写,后期难维护,加班熬夜去填“坑”;
缺少理论指导,遇到新项目不能举一反三,工作很平庸;
遇到需求变更这种事,除了抱怨两句客户,只能闷头做,无力反抗;
做项目没计划性,想到哪做到哪,总是延期,比其他同事做的慢;
不知道如何与团队协作,职业发展遇到瓶颈,无法得到晋升。
那时候我不知道啥是正规做法,主要靠自己摸索。也特别困惑:科班出身的程序员是否与我有同样问题?像微软、阿里等这些大厂的程序员,他们又是怎样协调完成好那么庞大的项目?我这个“野路子”程序员面临的问题,他们又是怎么分工协作解决的?
2002 年初,我有幸转了专业,成为了中国第一批软件工程专业的学生,有机会系统地学习软件工程的理论知识,这解开了我的很多困惑。
软件工程学让我知道,软件项目的开发其实是一个工程,整个开发过程是可以有效组织起来的;对于开发过程的各个阶段,已经有很多解决问题的最佳实践,有很多方法来帮助我们高效完成任务;我们还可以借助工具来协助管理,提升开发效率。
如果说以前自学编程时,我还是停留在学习各种编程方法(术)上面,那软件工程开始让我主动去思考这些“术”后面的“道”,去思考软件项目中各种问题背后的原因,以及各种方法后面的理论指导。
这种对“道”的思考,逐步影响了我思维方式,让我从单一的程序思维上升到系统的工程思维去看日常的问题;同时让我形成了一套自己对于软件开发和项目管理的方法论,能举一反三,指导我去灵活运用各种方法,或者根据项目特点创造合适的解决方法。
当然,软件工程学的价值不仅于此。有人说程序员是吃青春饭的,因为计算机技术更新太快,年纪大了学习能力下降,就很难跟得上了。于是就有人很焦虑,会关心未来技术发展趋势如何?我怎么才能跟得上这些技术变化?
亚马逊的创始人杰夫·贝索斯(Jeff Bezos)曾经在一次演讲中说:“人们经常问我,未来 10 年什么会被改变?我觉得这个问题很有意思,但也很普通。从来没有人问我,未来 10 年,什么不会变?”
这个回答同样适用于软件开发领域。在软件开发领域,有哪些知识十年前很重要,现在仍然重要,未来可能同样重要?
其实仔细分析,这些知识不外乎:数据结构、算法、面向对象思想、设计模式、软件工程。如果范围不局限于程序开发,还要算上测试、产品设计、项目管理、运维这些岗位。
你会发现,无论你是什么岗位,只要你从事软件开发相关领域,都绕不开“软件工程”,因为现代软件项目开发,多多少少都离不开软件工程知识的应用。
想象下在日常工作中,不管你用什么开发语言,不管是前端和后端:
你接到一个开发任务,如果想开发出客户想要的功能,你是不是先要做需求分析;
你接手一个复杂的、大的功能模块,是不是先要做设计,才能把复杂的拆成简单的,才能让大家一起分工去开发;
你完成一个功能模块,如果要保证质量,是不是需要写一些测试代码,还要做一些功能测试;
还有日常用的那些工具,像源代码管理、Bug 跟踪。
而这些内容,都是软件工程相关的知识,和你用什么语言无关。十几年前我开始工作时就在用这些知识,现在还是在用这些知识,未来这些知识还不会过时。
换言之,这就是经典的价值,为什么说我们要学经典,因为经典就是这个行业最为本质的东西。你顺着这个逻辑想,就知道为什么大学的计算机专业要设计数据结构、算法、操作系统、软件工程这样的课程了。
技术更新迭代速度确实很快,难以把握,更难以预测,但是软件开发背后的逻辑却万变不离其宗。
你只有掌握了这些逻辑,才能步步为营,不被快速发展的软件开发行业所淘汰。因为你脑袋里装有软件开发的战略,相对于赤手空拳、盲打莽撞的人来说,你更能在未来获得先机。
我经常会跟身边的朋友“安利”软件工程的重要性,但是往往都没有下文。究其原因,主要是传统的软件工程教学方法出了问题,各个知识点过于偏理论,难以和实际项目的应用联系起来,理解起来生涩乏味。导致有人误以为软件工程是枯燥、无用的。
回想当初我在学习软件工程课程时,并没有觉得特别枯燥,主要归功于三点:
我学习前已经有项目实践经验,所以学习时,很容易能将理论和项目经历串起来;
我在以前项目中有很多困惑,带着问题再去学习,这样效率更高;
即学即用,获得正反馈。我不仅会把软件工程的知识应用在工作中,还会把日常生活中的问题当成一个项目去思考,不停练习和获得正反馈。
我一直在思索,怎么让软件工程的学习,既不那么枯燥无味,同时,也具有实用性,即学即用,可以用来指引帮助我们来解决问题。
这样一直到 2015 年,我到美国攻读计算机的硕士学位,发现美国的计算机教育确实有可取之处,例如学校会聘请企业的专家作为兼职讲师,让学生有机会了解业界最前沿的技术趋势。
这些有丰富项目经验的企业专家讲师在讲课时,总能把一些知识点和鲜活的案例结合起来,和学生一起探讨这些知识点背后的历史和逻辑,让软件工程学变得易学、实用。
在美国读书的经历给了我很大启发,软件工程的学习,也可以不那么枯燥。恰好我的经历也比较特殊:
从自学编程的程序员到软件工程专业科班毕业;从技术开发到在微软飞信做项目管理;从程序员到技术总监;从几个人小团队到几千人的大厂;从国内公司到美国公司;从个人小项目到几千万用户的大项目;从传统瀑布模型到最新的敏捷开发。
这些丰富的经历,帮助我更好地理解了软件工程的知识,也知道如何应用它,可以发挥最大的效用。
因此,在这个专栏中,我会结合自身在软件开发中的经历,将软件工程中的知识点和我所看到的国内外前沿的、典型的项目案例结合起来讲解,也会和你一起分享我对这些知识背后的思考。和你一起去软件工程学中,寻找软件项目中问题的答案。
我希望最终,你能把软件工程知识和项目经验有机地结合起来,转换成你自身能力的一部分。
另外,在实际软件项目开发中,离不开各种工具的使用,像源代码管理、持续集成、看板、监控报警等,帮助我们更好地协作、规范项目流程、上线维护。
在本专栏,我也会在穿插着介绍各种工具的用法,有哪些价值,让你在了解后能很快应用到项目中,达到即学即用的效果,提高项目开发效率、规范项目流程。
我们的专栏会从“道、术、器”三个维度来讲解软件工程的知识内容。
“器”就是软件工程中的各种工具。
“术”就是软件工程中的各种方法。例如如何做需求分析?如何对需求变更做变更管理?
“道”就是软件工程知识的核心思想、本质规律。例如为什么要有需求分析?需求变更产生的深层次原因是什么?项目中决策的依据是什么?
在专栏的模块设置上,我将它分成了三大部分。

1. 基础理论

从宏观的角度建立起软件工程的知识结构,展现软件工程学的全景图,让你掌握从软件工程的基础概念到主流的软件过程方法论。我会帮你开始思维上的转变,去尝试用工程化的思维模式,去分析和解决工作和生活中的问题。

2. 项目过程

我会按照软件生命周期,把知识点拆成:规划、需求分析、设计、编码、测试、运行维护这六个阶段,然后带着你一起去了解每个阶段要侧重做哪些事;分析每个阶段常见的问题,找到解决方法;了解各个阶段有哪些工具可以对项目有帮助,从而学会应用它们。

3. 案例分析

在这个模块中,我会带你一起去看看这些大公司是怎么应用软件工程的。之前你可能会有疑惑,认为软件工程学很虚,我们小公司用不着,或者不知道怎么在实际项目中应用软件工程。
其实软件工程的思想是润物细无声,包括微软、谷歌、华为、阿里巴巴这样的大公司早已经深得其精髓,把它用得炉火纯青了。
你的公司,你遇到的大部分项目问题,都可以回到软件工程的逻辑里来解决。我会给你分享我看到的经典的软件工程案例,让你能够通过综合案例,把前面的知识融会贯通,并逐步内化为自己的基础能力。
简单来说,我希望通过这个专栏,你可以从知到行,打好基本功,掌握软件工程学中涉及的方法和工具,学会举一反三,在软件项目的开发和管理过程中,能运用自如;也希望软件工程的思维,可以让你脱离技术的拘泥,有更高的格局和视角去看待工作和生活中的问题。
最后,也希望软件工程学这门基础学科,真正成为武装你职业上升的盔甲。无论你想走技术路线,还是转向做管理,都能从赤身肉搏、苦钻技术却不得法的“野路子”,变得行有章法,在未来软件的快速革新稳步前行。
如果你在专栏的学习过程中,遇到任何问题,或者有什么想法,欢迎留言与我交流。相信这段学习之旅,你我都将收获满满。
好,那就让我们开始吧!
取消
完成
0/1000字
划线
笔记
复制
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
该试读文章来自付费专栏《软件工程之美》,如需阅读全部文章,
请订阅文章所属专栏。
立即订阅
登录 后留言

精选留言(41)

  • wusiration
    有什么推荐的软件工程书籍吗?一边学课程一边看

    作者回复: 下一篇就会讲,你可以先买一本《构建之法》,这是本专栏最佳搭配的书籍。

    2019-02-18
    17
  • 未设置
    终于等来了软件工程的课,太赞了。跟老师最初的感觉一样,我就是半路出家的程序员,希望软件工程的课能让我突破现在工作遇到的瓶颈。

    作者回复: 我也希望这门课能真真正正的帮助到你。另外你可以把一些具体的问题提出来,这样说不定我可以针对性的帮助你提一些建议。

    2019-02-18
    10
  • 江晨晖
    技术就像是工具,学习的快,也更新的快。软件工程就像是内功,知识内容很广泛,不是很好吃透。但是没软件工程的话,技术再高超,对于结果而言,也是白费的。这课不错。

    作者回复: 是的,再好的技术,也需要在项目中应用才能体现价值,而要保障项目成功 ,软件工程必不可少。

    2019-02-18
    7
  • ailei
    请教老师,除了《人月神话》、《人件》,还有哪些偏管理的软件工程的书?不算敏捷开发那几本

    作者回复: 有几本项目管理的书可以看看:
    《项目管理修炼之道》
    《项目管理-计划、进度和控制的系统方法》
    《软件项目成功之道》
    《做项目,就得这么干!》

    2019-04-01
    4
  • oO蜗牛君🐌、、
    软件工程真的很重要!

    作者回复: 是的,重要性毋庸置疑,最重要是要掌握它,让它为你所用 :)

    2019-02-18
    4
  • 杨良博
    计算机专业学生路过 大二上的这门课 当时java,数据库,软件工程是同一个老师上教的,开始就让我们自己看视频学java,数据库和软件工程的课也被用来看java视频,软件工程学期快结束了才讲讲,数据库也是发的视频自己看。。。。。。 现在来这里好好学学软件工程(苦笑)

    作者回复: 已经过去的事情只能是让它翻篇了,现在学也不晚。

    有时候学校老师或者公司领导不那么靠谱的时候,就得靠自己加倍努力了,加油⛽️!

    2019-03-02
    3
  • 逐风随想
    06年初中毕业,一直徘徊在建筑工地和工厂之间。14-15年因爱好自学了Linux运维,16年开始自学编程,至此,生活和思维发生了质的变化,刚入门的时候选择了学C/C++,学的很痛苦就中断了,之后转战PHP,JS,PYTHON等全栈技术棧。然后又回到了C/C++和Java。
    经过两年多的没日没夜的项目实战,终于勉强算是入坑了。长期以来都是购买别家设计的中型系统进行二次开发,直到公司提出要一些业务规划的时候,突然发现我TM压根没法自己独立构建一套像样的商业系统。一看到厚厚的需求文案 ,想象着这个庞大的系统该如何一步步进行呢? 希望这系列文章能学到解决之道。

    作者回复: 要想自己独立设计构建系统,可以先从模仿类似的系统开始。

    无论多庞大的系统,终究都能拆分成很多小的系统,系统一小,就好设计开发了。

    开始的时候,语言不需要太多,专注一点更好

    2019-02-24
    3
  • 一路向北
    一边干着软件开发,一边做着硬件开发,发现自己对软件的很多方面理解的不够深刻,因此在软件开发能力的提升就很小,期望跟着这个课能够加强自己的软件开发硬实力!

    作者回复: 我相信软件工程的很多知识,不仅适用于软件项目,在硬件项目的一些地方同样也可以应用。

    希望这门课能帮助到你,有具体问题也欢迎留言。

    2019-02-20
    3
  • 常平
    看到用 “道 术 器”来解读软件工程真的很赞,同道中人啊。正如科学理论抽象到最后是数学,认知抽象到最后一定是哲学。

    作者回复: 谢谢支持。
    在后面的知识点介绍,也是力求把“道”总结出来,懂了道自然就可以去用“术”和“器”,甚至创造自己的术和器

    2019-02-18
    3
  • 风起云涌
    宝玉老师,这门课程对于硬件编程,比如单片机开发,是否也同样适用呢?

    作者回复: 其实瀑布模型就是从建筑行业和电子行业学习借鉴的,还是有些相通的地方。但也有很多地方不一样,比如说硬件编程你照搬敏捷这一套迭代快速发布的方式恐怕不太可行,但其中一些好的实践也许可以借鉴。

    我对硬件编程不了解,建议你还是咨询你们行业的一些资深人士看看。

    2019-03-27
    2
  • Jone Tang
    "那时候我不知道啥是正规做法,主要靠自己摸索。也特别困惑:科班出身的程序员是否与我有同样问题?像微软、阿里等这些大厂的程序员,他们又是怎样协调完成好那么庞大的项目?我这个“野路子”程序员面临的问题,他们又是怎么分工协作解决的?"

    当我看到老师的这句话,我要哭了。我是野路子程序员,这也是我这几年的困惑,希望跟随老师学完这门课程后,找回属于我的自信!

    作者回复: 作为一个过来人,说点野路子程序员如何找到自信的感悟:自信这事,靠的是你正儿八经做成了一件事,哪怕是一件小事,一点一点的成绩积累,你就不会再觉得自信是个问题了。

    希望你学了后,把知识应用在你的工作中,帮助你把一件事情做成做好。如果有具体问题困难,也欢迎留言,我很乐意提供建议。

    2019-02-27
    2
  • AlphaZero
    说句和主题不相关的。作者你已经留学毕业了?十年前,我第一次求职,在 NCSoft 面试时,就是宝玉在招人。时间飞逝,感觉前不久才注意到你到美国留学了。

    作者回复: 是的,我15年来上学,17年已经毕业了呢。在NCSoft的时候还是09年呢

    2019-02-22
    2
  • PK時頭髮不亂
    软件工程是不是面对 项目经理 之类的管理岗位?

    作者回复: 项目管理一定需要软件工程的知识。软件工程知识并不只是项目管理可以用,同样适用于开发岗。比如开发也要做需求分析和架构设计,也要做计划。

    学习软件工程后也可以帮助开发人员更好的理解软件项目的整个过程,不再看局限于技术实现,拥有全局的视野。

    2019-02-21
    2
  • humor
    老师觉得程序员会有中年危机吗?有点话,中年的程序员比年轻的程序员差在哪儿呢?现在有点恐慌干了几年程序员之后会失业…

    作者回复: 我觉得中年危机和是不是程序员并不是太大关系。

    对于企业来说,关键还是性价比,比如中年程序员,如果薪水拿的是年轻程序员两倍,产出如果超出两倍,那么就是有价值的;否则价钱高两倍而产出不到两倍,企业就会考虑更多雇佣年轻的程序员。

    会不会失业在于你是不是能继续创造价值,一个有经验的程序员是可以帮助团队少走很多弯路的,所以把手头事情做做好,然后保持学习,让你的经验为团队创造价值,这样应该不用担心失业问题。

    像软件工程这种知识,对于你想转型管理或者提升个人能力,都是很有帮助的。

    2019-02-19
    2
  • 喜欢跑步的鲁鲁修
    感谢宝老师。。期待彼此收货满满

    作者回复: 谢谢,有具体问题也欢迎留言。

    2019-02-26
    1
  • 胖狐狸
    个人学习目标:
    1. 梳理学过的理论知识,使其更加系统,查漏补缺。
    2. 学习软件开发各阶段的业界最佳实践。
    3. 理论指导实践,提高工作中的开发效率和软件质量。
    4. 了解核心思想、本质规律,加强自身核心竞争力。

    作者回复: 加油,学习过程中有具体问题也欢迎留言

    2019-02-23
    1
  • Galwin-Chain光威
    跟老师一样,我也是大学时候对开发技术有兴趣,然后转专业到软件工程的。现在做开发快五年了,公司现在项目管理比较混乱,希望可以从这个专栏学到东西

    作者回复: 在专栏里面会有一些案例的介绍和工具使用,希望可以帮到你。有具体问题,或者想法,也欢迎留言

    2019-02-22
    1
  • cugxhhuang
    太好了,之前看软件工程原理、相关工具的书,总是看完之后懵懵懂懂,但是不知道如何将看到的知识应用在具体的项目中,感谢老师开设这个课程,希望通过这个课程,能让我学会将书本的理论知识变成自己理解的、能举一反三的能力。

    作者回复: 在课程中,会尽可能结合实际项目案例来讲,希望能帮助你理解。有具体问题也欢迎留言

    2019-02-22
    1
  • 大李秋刀
    非专业程序员,目前工作遇到软件工程知识严重缺乏的瓶颈,期待破解困局!😂

    作者回复: 加油!

    要破解困局,也不要仅仅寄希望于一门课,而是要分析一下自己困境在什么地方,你的目标是什么。

    想清楚目标后,要对你的目标分解,再去制定一个针对性的计划,行动起来,这样才能真正的改变。

    2019-02-21
    1
  • duchao_hit
    老师,有没有总结的知识结构脑图

    编辑回复: 明天0点的那篇文章里有哈。

    2019-02-20
    1
收起评论
41
98
返回
顶部