type
status
date
slug
summary
tags
category
icon
password
大三的时候有一门课叫软件工程,我其实特别好奇为什么会在大学要开这样一门课,让一群没有任何开发经验的大学生,来学一堆工程上的理论。奈何大家没有任何工作经验,甚至是开发经验,所以学起来自然没有任何体会。考试时候真的就跟背书一样,去背那些抽象的理论。
软件工程的复杂度,绝对不是看个谭浩强、马士兵什么的就能看明白的,更不是所谓学C/C++的时候在console小黑框里的那种东西,抑或是打个什么算法题oj那样的,那绝对不是软件工程。软件工程的复杂性、可变性、软件整合度、不可见性,远比想象中复杂的多的多。
像机器、程序这样,都是有确定性的问题(虽然可能会有像支付宝那样电缆被挖断的这样那样的不可控因素),都已经很难了。还有最大的不确定性问题,就是人。人是最不可靠的,这是最大的难点。沟通、合作,这成本是非常高的。绝对不存在一个人的工作效率是w,两个人开发就是2w,绝对不可能的,而且系统越大往往越复杂,不光架构设计的学问大,团队内的分工组织也很重要。
正所谓“软件工程没有银弹”,就是说软件工程这个东西它并没有一个确定的解,不是写一个数学题,算法题那样,一个输入就是对应一个输出的。软件工程的难点和艺术也在于此。如果说有一个万用解,这么牛,那大家都按照这套做不就行了吗,哪来那么多最佳实践、什么方法论技术分享的。
我自己对于软件工程的理解是:软件工程的艺术,是平衡取舍的艺术,是怎么在各种有限条件中去trade-off的艺术。
而这平衡中最重要的,就是要找到耦合和解耦的平衡点。软件工程考试总在背什么“高内聚,低耦合”,有可能不耦合、不依赖嘛?而且尽可能地不耦合一定是好的嘛?解耦很自然地降低了系统的复杂度,各模块之间正交化;但这个过程中牺牲的性能,一个个抽象产生的代理引入的不可靠性,由谁来承担这个成本?(好吧,我又咄咄逼人了,我只是想换个思路)你必须考虑成本!你开始假设在一个小团队,有一个不错的产品想法,重要的是应该快速开发上线,而不是做过度设计,市场早被抢完辣!当然,并不是说不做模块划分,我只是说出我的想法,不是一定要在一开始就做到尽善尽美的极致抽象。而且,抽象、模块划分是软件工程开发中最重要的能力,只是说要找到那一个点,在对的时候做对的事。
除此之外,平衡的点还包括但不限于:业务和技术之间的平衡、需求和实现之间的平衡、软件和硬件的平衡、静态和动态的平衡、成本和收益的平衡、时间和空间的平衡、机器友好和对人友好的平衡......可以说的平衡点有很多。也正因此,软件工程其实是非常难的,也并不是扔本机工黑书,念个PPT,做一个所谓的什么软件工程实践大作业就能搞明白的。
- Author:王帅真
- URL:https://blog.qizong007.top/article/3c1c36c2-55c8-417f-af7e-04a238f7a762
- Copyright:All articles in this blog, except for special statements, adopt BY-NC-SA agreement. Please indicate the source!