Coding只是基础,思维能力才是关键

Software engineering isn't just about keystrokes; it's fundamentally about problem-solving and critical thinking.(软件工程不只是敲键盘,其本质是解决问题的能力和批判性思维的能力)

这也是我写《程序员的底层思维》这本书的初衷,coding能力和经验固然很重要,但更重要的是如何从这些经验中提炼出可以复用的“方法论”,锻炼我们的思维能力,让这些“方法论”(思维能力)可以迁移、解决更多未知的问题。因为作为软件工程师,我们会在不同的公司,不同的部门工作,伴随着的是我们面临的领域,问题域也会常常变化。

就拿我个人来说,我做过银行的票据系统;苹果公司的客户管理系统;eBay的支付账务系统;阿里的交易、客服、CRM、商品等多个子系统;来华为后,又开始做运营商的SmartCare系统,华为云的云平台底座系统,最近又在做云原生容器相关的事情......去年还代表华为给招商银行做了多个金融系统的咨询服务。

这些业务的差异性都非常大,但我用来应对这些问题的冰山之下的东西没有变。更准确的说是最近4年没有变,因为才开始工作的几年里,我压根还没有这样的意识和能力。之后的数年中,我才意识到这些思维能力的重要性,并开始提炼、总结、锻炼、提升这些能力。

关于这些思维能力的详细我已经写在《程序员的底层思维》中,今天我想跟大家说,在这些思维能力中,最重要的是分治思维能力、结构化思维能力、抽象思维能力以及批判性思维能力。

对于软件工程师而言,解决业务问题是我们的根本。而解决一个问题,我们首当其冲的就是了解问题、分析问题。这就需要分治思维。分治就是把大问题分解成小问题(breaking the problem into smaller, more manageable parts),都知道要分,然而怎么分才是关键。这里主要依托两个事情:

  1. 结构化思维:做问题拆解,不是乱拆,要用结构化的思维去拆。简单说,结构化思维以逻辑思维为基础,是一种从无序到有序、从混乱到清晰的思维能力,可以帮助我们从繁杂的信息中,以一定的逻辑顺序,整理出清晰的结构的思维。对于被拆解之后的各个元素之间,首先要满足正确的逻辑关系,然后在各个层次上要满足抽象层次的一致性,比如水果、香蕉就不适合放在一个层次,他们不是一个抽象层次的。最后,各个元素要满足MECE(Mutually Exclusive Collectively Exhaustive)法则,也就是要彼此正交,不要互相踩脚。

  2. 工作经验:上面的思维说起来简单,但真正做起来并不容易。这就需要经验了,经验的好处是可以帮助我们识别共同模式(Pattern Recognition),即发现当前问题和解决过的问题之间的相似性(identifying similarities between the current problem and previous ones),然后通过迁移借鉴,解决当前的问题。当你处理过的问题越多,能用来借鉴的经验就越多,从而解决问题的能力就越强。

问题分解是一种自顶向下的过程思维,与编码范式对应的就是过程式编码。然而还有一种更高级的思维——抽象思维,抽象思维是一种自下而上的釜底抽薪式的思维能力,与编码范式对应的就是面向对象编码。他需要我们从繁杂的信息中,去除冗余和细节,发现问题的核心 (removing unnecessary details to focus on the core problem)。

假设有一个业务需求,需要能挑选出水分多的西瓜,外表红润的苹果,饱满的葡萄....... 最直观的做法是Watermelon.isJuicy( ),Apple.isRed( ),Grape.isPlump( )。这种做法虽然可以解决问题,但明显抽象层次不够。更合理的做法应该是将西瓜、苹果、葡萄抽象为Fruit。然后进一步和业务方对焦挑选水果背后的原因,业务方可能会告诉你:“挑选是为了给水果分出等级,然后不同等级其价格会不一样”。在真正理解业务之后,你就明白,isJuicy,isRed,isPlump实际上是在表达优质水果的意思,这样你就可以将这些动作抽象为isOptimal( )。

也就是说Fruit.isOptimal( )才是对这个问题的合理抽象,而且满足了很好的扩展性,因为后续即便还要挑选黄色的香蕉,光滑的甘蔗...... 在当前问题的上下文下,都逃不过Fruit.isOptimal( )的范畴。

实际上,我们说的领域建模,就是对问题域进行抽象,找到核心概念(实体),然后再构建实体之间的关系的过程。这些关系包括组合,使用,继承、泛化等连接关系,也包括1:1、1:N、N:N这样的数量关系,把实体和关系勾勒好,便形成了我们想要的领域模型。这个建模的过程,需要我们对问题域有深入的理解,要变成“领域专家”,因为唯有如此,才能做出合理的抽象。唯有如此,你才能避免像Watermelon.isJuicy( )这样不合理的抽象。

最后是批判性思维(Critical Thinking),批判思维在软件工程领域就是我们耳熟能详的的“没有银弹(No Silver Bullet)”。因为我们软件工程师碰到的每一个问题都是不同的,我们可以借鉴经验,但不能陷入经验主义。而是每一次都应该用批判的眼光,认真权衡,小心决策。批判思维应该贯穿我们软件工程的始终:

  1. 设计阶段:选择什么样的架构风格、设计模式。工程师必须对每个选项的优点和缺点进行分析,考虑到各种因素,如可扩展性、可维护性和性能等。(critical thinking is applied when choosing between multiple potential solutions or design patterns. The engineer has to analyze each option's merits and drawbacks, considering factors such as scalability, maintainability, and performance.)

  2. 实现阶段:编写高效且有效的代码需要批判性思维。这包括选择正确的数据结构和算法,确保代码可读性,以及维护软件的安全性和完整性。(critical thinking is necessary for writing effective, efficient code. It involves selecting the right data structures and algorithms, ensuring code readability, and maintaining the software's security and integrity.)人人都能写出可以工作的代码,但只有高手才能写出好代码

  3. 测试阶段:工程师运用批判性思维来发现可能不易被察觉的问题。这不仅包括寻找明显的错误,还包括识别潜在的设计缺陷、可用性问题以及性能瓶颈。(Engineers apply critical thinking to uncover any issues that might not be apparent at first glance. This includes not just looking for evident bugs, but also identifying potential design flaws, usability issues, and performance bottlenecks)

软件工程是问题解决和批判性思维的有机结合,编码是其表现形式。敲击键盘产生的代码只是一种传递媒介,它将解决方案传达给机器。

随着软件在我们社会中的应用越来越广泛,软件工程师的角色也随之增大。仅仅是编程技术熟练的编码者已经不够,工程师必须是能够熟练使用抽象思维、结构化思维、批判性思维来解决问题的人,能够在复杂的需求、限制和用户需求中找到解决方案。综上所述,软件工程的核心不仅仅在于编程,更在于问题解决,以及解决问题所需要的各种底层思维。

  • 7
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值