向初学者学习编程技巧

向初学者学习编程技巧

如何从初学者的行为中学习编程技巧?

避免过度嵌套的条件判断语句:条件反转

初学者的(存在问题的)做法:

def foo(*args):
    if cond1:
        if cond2:
            if cond3:
                return something complex
    return 0

条件语句的嵌套太深了,可读性不佳。

稍微好一点的例子:

def foo(*args):
    if cond1 and cond2 and cond3:
        return something complex
    return 0

这样做的缺点是,在每个条件都很长的情况下,if cond1 and cond2 and cond3这一行代码会很长。

受此现象启发,改版的代码:

def foo(*args):
    if not cond1: return 0
    if not cond2: return 0
    if not cond3: return 0 
    return something complex

虽然这个代码可读性也一般,但是也提供了新的思路:模式匹配的思路在开发的很多时候是很有用的。算是多种思路吧。

代码简化:建立思维惯性和直觉

初学者的(存在问题的)做法:写代码时没有直觉,或事事自己实现而不调包。

建立直觉包括:

  • 明确知道“调包”的范围:在这个范围内的代码不要手动实现,而应该选择调包。这样做的好处是,不但省工省力,而且可读性好。
    • 原则上,只要有包可调,就应该调。但实际上,应该选择实现起来最简单/效率最高/可读性最好/可维护性最好的方式。要理解包的逻辑粒度(granularity of logic),如果功能很简单但是包很复杂,就没有必要过度fit包。
  • 在写下一行代码的时候,明确知道自己期待什么,并能够目标导向地debug。或者说,对于自己的预期目标,能明确地描述之,并能建立完整的思路实现这个目标。

建立直觉的方式:

  • 多投入时间写代码
  • 多参与要求质量的、不同方向的项目
  • 接触编程语言和编程范式
  • 多思考自己该怎么把代码写好

代码优化的准则:先完成功能再优化

初学者的(值得借鉴的)做法:啥都不想,先完成功能再说。

一旦在写代码的时候考虑过度,比如一边写一边考虑性能优化、安全问题、可读性优化等,就会降低开发效率。在辅助直觉判断的情况下,应该先实现功能,再考虑各项指标的优化。提前考虑的很多目标,尤其是性能优化,很有可能被证明是没有用的(在开发者的自我测试中,或在后面的迭代中)。所以,先work再说。

更细致地说,目标的层次应该是:

  • work,且没大毛病:最优先的目标
  • 可读性:在开发时和上一步同时做到,方法是在开发中通过开发经验来保证代码质量
  • 可维护性:在开发时和上一步同时做到,方法是使用设计模式
  • 性能:相对最不重要

等等…目标性问题?

有目标的探索方法:明确目标,然后找到工具来解决它。
无目标的探索方法:我想要X,于是我做了Y,并这样那样的改了一下,现在部分work了,但我不知道为什么这部分work,也不知道为什么其他部分不work

对于程序员的编程工作,肯定要采用前者。对于生活中的其他问题,不好说,因为没有明确的目标/评价指标,而且通常没有“完全解决”或者说“最优”的方法。

The way of code: We proceed by understanding the abstractions afforded by the language, and then match those abstractions to a model of the business domain of the program

从工具开发者的角度来说,应该设计工具的功能,使得工具支持使用者的成功:有目标时,方便使用者使用;无目标时,能把使用者领到正确的道路来。

不要钉死在一门语言上

初学者的(存在问题的)做法:以Java入门的初学者认为类是编程的最小粒度,所以(比如)在编C++时,实现很简单的逻辑也非用类不可。

心得:

  • 不要钉死在一门语言上,过度overfit这门语言的高级特性,而不去关注其他语言的低级特性。(这种情况尤其在OOP语言上出现的多。)这样会使自己考虑问题和解决问题的思维过于片面,从而得不到最优解决方法。
  • 要根据实际情况写代码,不要过度fit设计模式而使代码很冗余。

经验:还是上文所说的,多接触几门语言和几种设计模式,并将其概括,活学活用。

多读代码

初学者的(存在问题的)做法:只用自己习惯的模式写代码,读别人的代码,采用的语法或开发的思路不同于自己所习惯的范式,就读不懂了。

心得:

  • 从输入的层面:多读代码,培养自己“读得懂代码”的能力。这样做的好处是增加学习速度(在需要的时候),以及在和他人协同开发时不会出问题。
  • 从输出的层面:如果是明确的模式,就写出来(代码、注释),使读代码的人能意识到;对于其他,根本不要形成模式,就算看起来很有规律也要解释清楚:this is not universal.

技能树(技术栈)的取舍

学习了高级的东西之后,要积极地忘记低级的东西,不要在低级的事情上浪费时间。

正例:FP和OOP是并列的,学会FP之后也不要忘记OOP,实践时该用啥用啥。
反例:(只是举个例子)推出Python3且Py3逐渐成为主流,就应该拥抱Py3,把原来用Py2写的东西换掉;进入大学之后高中的知识点已经不再重要,应该好好上课和学习,而不是继续巩固高考的知识点。

本文是对What senior developers can learn from beginners的学习笔记,不过在内容上多有扩展,加入了很多自己的认识和例子。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值