后端技术面试38讲
李智慧
同程艺龙交通首席架构师,前Intel&阿里架构师,《大型网站技术架构》作者
立即订阅
3682 人已学习
课程目录
已更新 16 讲 / 共 38 讲
0/4登录后,你可以任选4讲全文学习。
开篇词 (1讲)
开篇词 | 掌握软件开发技术的第一性原理
免费
软件的基础原理 (8讲)
01丨程序运行原理:程序是如何运行又是如何崩溃的?
02丨数据结构原理:Hash表的时间复杂度为什么是O(1)?
03丨Java虚拟机原理:JVM为什么被称为机器(machine)?
04丨网络编程原理:一个字符的互联网之旅
05丨文件系统原理:如何用1分钟遍历一个100TB的文件?
06丨数据库原理:为什么PrepareStatement性能更好更安全?
07丨编程语言原理:面向对象编程是编程的终极形态吗?
答疑丨Java Web程序的运行时环境到底是怎样的?
软件的设计原理 (6讲)
08丨软件设计的方法论:软件为什么要建模?
09丨软件设计实践:如何使用UML完成一个设计文档?
10 | 软件设计的目的:糟糕的程序员比优秀的程序员差在哪里?
11丨软件设计的开闭原则:如何不修改代码却能实现需求变更?
12 | 软件设计的依赖倒置原则:如何不依赖代码却可以复用它的功能?
13丨软件设计的里氏替换原则:正方形可以继承长方形吗?
不定期加餐 (1讲)
加餐 | 软件设计文档示例模板
后端技术面试38讲
登录|注册

10 | 软件设计的目的:糟糕的程序员比优秀的程序员差在哪里?

李智慧 2019-12-13
有人说,在软件开发中,优秀的程序员比糟糕的程序员的工作产出高 100 倍。这听起来有点夸张,实际上,我可能更悲观一点,就我看来,有时候,后者的工作成果可能是负向的,也就是说,因为他的工作,项目会变得更加困难,代码变得更加晦涩,难以维护,工期因此推延,各种莫名其妙改来改去的 bug 一再出现,而且这种局面还会蔓延扩散,连那些本来还好的代码模块也逐渐腐坏变烂,最后项目难以为继,以失败告终。
如果仅仅是看过程,糟糕的程序员和优秀的程序员之间,差别并没有那么明显。但是从结果看,如果最后的结果是失败的,那么产出就是负的,和成功的项目比,差别不是 100 倍,而是无穷倍。
程序员的好坏,一方面体现在编程能力上,比如并不是每个程序员都有编写一个编译器程序的能力;另一方面,体现在程序设计方面,即使在没有太多编程技能要求的领域下,比如开发一个订单管理模块,只要需求明确,具有一定的编程经验,大家都能开发出这样一个程序,但优秀的程序员和糟糕的程序员之间,依然有巨大的差别。
在软件设计开发这个领域,好的设计和坏的设计最大的差别就体现在应对需求变更的能力上。而好的程序员和差的程序员的一个重要区别,就是对待需求变更的态度。差的程序员害怕需求变更,因为每次针对需求变更而开发的代码都会导致无尽的 bug;好的程序员则欢迎需求变更,因为他们一开始就针对需求变更进行了软件设计,如果没有需求变更,他们优秀的设计就没有了用武之地,产生一拳落空的感觉。这两种不同态度的背后,是设计能力的差异。
取消
完成
0/1000字
划线
笔记
复制
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
该试读文章来自付费专栏《后端技术面试38讲》,如需阅读全部文章,
请订阅文章所属专栏。
立即订阅
登录 后留言

精选留言(9)

  • Paul Shan
    僵化性代码的例子是滥用了继承,导致添加一个小功能,所有的基类和派生类都要修改。
    脆弱性代码的例子是引入全局依赖,导致意外的修改扩散。每当我看到很多全局变量的时候,对程序的掌控感荡然无存。
    牢固性代码的例子是超大类,由于类内部是可以任意访问,所有的巨量函数和属性组成了一个巨大完全图,牵一发而动全身,根本不知道从哪里下手。
    粘滞性代码的一个例子还是全局变量,大家觉得觉得用得也挺顺手的,还有人说重用这些能提高效率,让我也很无语。有了注入依赖以后,这些全局变量被包了一层外衣,到处泛滥而不可收拾。
    晦涩性代码的例子是过多if语句,一开始可能还好,最后if越加越多,导致看完都成问题。

    2019-12-13
    14
  • 难得糊涂ck
    A:可以说脏话嘛?
    B:不能。
    A:那我没什么好说的
    2019-12-13
    2
  • 观弈道人
    想了解下智慧老师是如何提问考察应聘者编程能力和编程技巧
    2019-12-13
    2
    2
  • 探索无止境
    优劣设计案例做对比,最能让人理解到文字所阐述的点,希望老师可以举更多的例子,这样更有收获
    2019-12-13
    1
  • 灰灰
    打卡
    2019-12-19
  • 靠人品去赢
    不用看别人,我的代码就很有问题,主要问题有一,命名,代码的命名是门大学问,看到一本书说是好的命名相当于完成来一部分代码,看点指导性的书还有一些具体的最佳实践,比如说阿里自己的编程规范,github上有,在他那个插件里面。
    第二个,设计模式用的不够好,总是if else来写代码,实际上可以借助文中的例子,采用一些设计模式,像工厂模式借助Java的父类和子类,接口解耦来搞一下,防止出现厄运金字塔的代码。
    2019-12-18
  • 云川
    刚刚改造后的例子中,从纸带读取数据不是也要去实现自带的类吗。如果不同程序员对输入和输出有不同的要求,是不是让他们自己实现输入输出接口然后作为参数传入进来?
    2019-12-15
  • golangboy
    1. 在写代码前,把逻辑理清楚;
    2.分离变化和不变的过程,将数据的传输控制和解析处理分离。对于变的地方,函数式编程中用不同的函数去灵活替换,对象编程的话,就用不同对象去替换。这样程序设计面对需求时就灵活了;
    3.函数适量的拆分,不要太长,太长太丑、看起来累,也花时间;
    4.函数名不应怕过长,尽可能用表意清晰的函数名,少用简写缩写,那对看的人是灾难,增加沟通成本;
    5.c语音中尽量用面向对象的方式去设计程序,go中尽量用channel,groutine去设计程序,否则不会有个好的体验。
    设计模式没有学透,进行程序设计时,一下子想不起那么多特别的约定,除了一些常用的。
    老师,面试的时候,我就特别怕人问设计模式相关的,一是没学透,不知道怎么说;二是安自已理解的来又怕说错。我反复看设计模式,给我感觉就是变与不变的分离,像我这情况,面试时,面试官会觉设计模式都说不清,代码肯定凌乱,我该怎么应对呢?

    2019-12-14
  • sunfuwen
    Reader reader = new KeyBoardReader();
    Writer writer = new Printer():
    void copy()
     {
          int c;
          while(c=reader.read() != EOF)
                writer.write(c);
    }
    2019-12-13
收起评论
9
返回
顶部