17|软件设计能力:工程师的核心竞争壁垒

竞争壁垒在哪
- 深入了解
- 翻译
- 解释
- 总结
《工程师个人发展指南》,新⼈⾸单¥59
全部留言(7)
- 最新
- 精选
- pyhhou老师说的很好,我也说说自己的理解,还望老师指正。 用一句话来定义软件设计——对需要的场景,制定一套易于理解且稳定的流程或方法。 你可能会说,你说的是不是太简单了,我觉得要做到一点都不简单。这里的重点在于 “需要的场景” 和 “易于理解且稳定”。场景越大,你需要考虑的情况就越多,也越复杂,就像文章中说的,规模越大的项目就越考验设计能力。并且你还要能保证第二点,你设计出来的东西可以很轻易的交给别人,并且别人不需要有过多的经验就可以实现,维护并且拓展。这需要日积月累的经验,之前踩过的坑,碰过的壁,犯过的错都会帮助你设计出更完善的系统,当然还需要你学习解决问题的方法,行业的最佳实践等等,这才能让你设计出来的东西更简单且实用。 那些好的,且历经岁月依然被广泛使用的软件或标准,是不是都很好地做到了这两点?这里举些例子: - TCP/IP 协议 - Unix 系统 - AWS 里的 Java API 接口 想要做好软件设计,需要心中有追求,不能带着完成任务的心态去设计,写程序。要时时刻刻都想着怎样才能把自己负责的部分做到不会出错,又怎样才能让他人非常容易地就理解自己设计出来的东西。并且还要时不时地回过头去想想那些前人总结出来的最佳实践,比如设计模式、编程范式、设计原则等等,不断尝试新的领域,不断经历,不断踩坑,不断犯错,又不断回过头去反思这些方法,你的软件设计能力就会逐步提高了。 Linus 说过,这世界程序员之所有高下之分,最大的区别就是程序员的 “品味” 不一样。是的,软件设计就是程序员的品味,争取做一个有品味的程序员:)
作者回复: 你好, 哇,写了这么多。从你的字里行间,我能感受到你对这个职业的热爱,太好了。 我也觉得你的定义一点都不简单,也就是“简单不简单”。你的定义中,很重要的强调了落地问题,也就是软件设计不能飘在空中,这一点我与你的想法完全是一样的。另外,我注意到你还用了“稳定”、“流程”这样的字眼,前者给我的感觉是一种细致,后者给我的感觉是机制化,这些都是很好的思考。 祝你早日成为自己认可的、有品味的程序员!:-)
2024-04-23归属地:美国9
到不了的塔李老师,你好, 随着微服务的流行, 服务的规模和复杂度都大大降低,这是不是也意味着对软件设计质量的要求也越来越低。如果行业对软件设计质量的要求降低,那软件工程师的竞争壁垒又在哪呢?作者回复: 你好, 微服务化就要用到软件设计能力才行,特别是要用到领域驱动开发DDD,这个方法论本质就是将业务与技术糅合在一起的,需要有很好的软件设计能力才行。 当然,当采用DDD完成了服务的切拆分后,如果我们聚焦于单个微服务上,可能因为服务的功能足够内聚和简单,以为不需要软件设计能力了。 其实,不只是针对微服务这事,任何一个软件行业都存在类似的现象。那些做服务切拆分的人,大多是经验丰富的人,而我们每位工程师都应想着成为那样的人才好,这样发展空间才会更大,才能真正构建竞争的壁垒。 总之,我建议咱需要紧盯自己如何成为切拆分服务的人,而不是只盯着实现单个微服务的人。
2024-04-19归属地:上海3
极客001老师您好,我觉得的软件设计是在明确用户需求的前提下对用户需求进行归纳总结,然后确定整体技术架构,最后通过代码一步一步进行功能实现,最终形成一个完整的系统。在系统流程设计中,要站在客户角度进行思考,在满足需求的前提下尽可能将系统的操作设计的简单明了,让用户有一个好的体验,真正便利于客户的工作生活,真正做到科技改变生活。作者回复: 你好, 不知你是否注意到“软件设计”与“软件开发”的区别呢?我理解前者是后者的一部分,而你的表达更说是在讲软件开发呢?! 再试试聚焦于软件设计?
2024-04-26归属地:北京1- FireMo软件设计,目的是设计出一个符合业务需求的软件,首先是从业务需求出发,要充分理解需求,然后抽象出概念,基于概念确定功能点,将一个或几个功能组合成模块,从面向对象的角度在模块内部实现高内聚,模块之间的通信实现低耦合;各个模块之间相互隔离。一定要从美学角度出发,设计出让别人看一眼就能懂的软件,后续才能写出让别人一眼就能看懂的代码。
作者回复: 你好, 在你分享中,最打动我的是“美学”两个字。是否有这一追求,能很好地区分普通工程师和优秀工程师。这种追求可能会让人觉得有点虚,但只要工程师能基于自己的思考和实践将之给做实了,我相信那就能显著地区分普通和优秀了。 加油!
2024-04-22归属地:山东1
卢泽华我理解的软件设计就是 给软件里面某些元素(服务、组件、模块、对象、函数)分配职责,也就是这些元素要干什么,然后这些元素如何配合。也就是概念及其关系。软件要应对复杂度和需求的变化,所以就需要对软件元素进行抽象。关键在于如何抽象,抽到哪个层次上,比如把变化原因一样的对象放在一起(单一职责),把变化频率一样的放在一起(也就是分层)。面向对象建模里面也就是名词和动词,有哪些对象(名词),这些对象的职责是什么(动词)。作者回复: 你好, 蛮生动的理解。如果让你用一句话来表达(比如,50个字内),你又会如何组织呢?我相信这个任务给到你,你得再对自己的理解做梳理和抽象才行,这也话也算是一次设计任务吧。
2024-04-18归属地:陕西1
SMTCode我理解的软件设计是:通过理解项目或产品的需求,对需求进行抽象,选择合适的技术,然后进行拆分,先通过最小原型去验证与需求的契合度和设计的合理性,然后再同过不断迭代,完善项目机能,同时还要考虑如何进行测试和确保质量的方式,在合适的时间对小部分代码进行再拆分和重构,让代码有一个易维护、可扩展的基础底座。作者回复: 你好, 你的这个理解给我最大的感受是非常接地气,如果用团队效能动力模型来说,就是你有很好的业务技能,这是非常难得的。 就软件设计这个概念,我觉得你还可以更聚焦于自己的工作过程中,哪个过程你是真正在做软件设计,放到那个场景你在思考什么、纠结什么,将这种感觉给表达出来,可能就对了。 当然了,每个人对于软件设计的理解是不同的,这并没有标准答案。无论如何,我期待你在未来能更多地关注这个问题,我相信当有一天你看清楚了,有自己的见解了,那能力也一定得到了很大的增加。 我们一起加油!
2024-04-18归属地:辽宁1
java小霸王
软件设计:识别出元素,以及元素之间的关系作者回复: 你好, 虽说你的表达很简单,但还是很好地抓住了重点。如果让我帮助完善的话,你的“识别出元素”我理解为是概念的塑造。
2024-05-11归属地:广东