IT技术博客大学习 共学习 共进步

[设计师学编程]那些绕不过的概念

00's UX Adventure 2015-04-26 22:10:08 浏览 3,421 次

编程语言虽说跟自然语言类似,但有一些本质的区别,如果不理解这些区别,编程的槛始终过不去。这篇文章尝试把几个最要紧的概念提取出来咀嚼消化。

一、变量 vs 替身

例如:想要写个程序,实现:周一至至周日显示不同的早餐菜单。

我们需要有一个东西来代表“今天是周几”。可能性有 7 种,但是活在当下的只有 1 个,于是需要一个“替身”,框定它的“变身”范围是周一至周日,然后让它根据条件变变变……

这是对编程思维的第一个训练:【抽象】将某种类型、某个范围内变化的“实例”,抽象为一个“代号”。

坑:

变量命名

大妈在上周的 QA 里面提过,这几乎是一个终极问题…… 我的理解是,这个命名同时承载了占位符、运算对象、功能解释、类型暗示、作用域暗示 等等的使命,于是短了烧脑,长了烧眼……

理解成本

虽然程序是自己写的,变量是自己命名的,但是每一次回看程序时,都存在“翻译”变量名的隐性步骤,这个步骤消耗了很多认知资源,相当于脑子里面得有很多对牵线木偶,运行前是一个,运行后是另一个……相信这是老手感受不到/回忆不起的一种状态。尤其当程序长了以后,变量越来越多,记忆变量和管理变量都成问题,还容易犯看错变量名的错误。

填坑:

  • 定义函数时想想丫的用途和变化范围,加注释

  • 避免用三个字母以内的命名,使用一个月后再来仍然能快速理解的命名

  • 变量多的话,分一下组,或者动手画一下它们的关系帮助理清思路

二、数组 vs 分格抽屉

替身虽好,但是有时候还是不好管理,执行命令起来效率有点儿低,因为同质性不够高(虽然替身都是人,但可能年龄、爱好、性取向、左撇右撇、甜豆花派咸豆花派等等都不尽相同)、以及没有按顺序排列。

于是我们需要一个更“军事化”的组织——数组。数组就像一个分格抽屉:

从外面看来,一个抽屉就是一个东西(里面能装很多东西);打开抽屉,里面是按照顺序放置的同一类东西,每一格都有位置编号(指针)。

这是对编程思维的第二个训练:【压缩】对同样的东西,折叠再折叠,收纳再收纳。

坑:

抽象

因为抽象,容易见抽屉而不见格子。写下数组太轻松 array[] ,但是一旦加入到运算中(尤其是循环),脑内演化就容易一团浆糊。

抽屉里面的抽屉

复杂性上升一维,需要先辨别是哪个抽屉,然后再定位到抽屉内的单元。

小抽屉为大抽屉增加了多样性,一个抽屉放马卡龙,一个放铜锣烧,一个放…益力多…………

至于N维数组……

填坑:

  • 克服对数组的心理恐惧,多使用这么简洁高效的工具,嗯

  • 为对抗数组高浓缩占位符的假象,见到数组自动脑补几个空行给它

  • 对循环语句中的数组尤其警惕,试着画一画?

数组一直是我的槛,回头需要再补看视频和笨方法,专门写写数组的笔记。

三、判断+循环 vs 防伪点钞机

嗯?点钞机?

点钞机工作特点:根据设定的条件,重复同一步骤。这正是 “判断+循环”的精髓。感谢它将我们从机械劳动中解放出来。

下面的代码虽然只有几行,但是综合了变量、运算、循环判断、数组等等,浓缩是浓缩,坑也很多……

for shapes in shape_list:
if shapes[1] == “circle”:
canvas.draw_circle(shapes[0],Radius, 1, “Black”,shapes[2])
else:
canvas.draw_polygon(shapes[0], 1, “Black”,shapes[2])

以上对编程思维的第三个训练:【自动化】找出条件,识别共同步骤,循环处理,实现量变到质变。

坑:

抽象
循环里面如果有个函数调用,再来个二维数组,脑子马上就浆糊了

填坑:

用 viz mode 这类的可视化工具帮助理解,训练循环折叠思维…… 推荐偶像Bret Victor的一篇文章:LEARNABLE PROGRAM — Designing a programming system for understanding programs ,中文版 易学编程:一个帮助理解程序的编程系统的设计

四、函数 vs 百宝袋

每个函数,都是哆啦A梦百宝袋里面的一件宝物!

宝物的特点是什么?实现大雄的一个愿望。至于怎么实现的,大雄并不用担心。当然,想实现多个愿望,最好不要指望于一件宝物,那样往往会出bug……

说回最开始一周早餐菜单的例子。要 print 不同的菜单,我们需要先判断今天是周几,这件事可以写到一个函数 whatIsTheDay() 中。以后一旦要做这件事,就 call 一下这个函数,外包这项任务给它,自己就翘着二郎腿等着它给出结果。一个程序中有多个函数,也就成了一个百宝袋。

函数的强大之处还在于,可以通过参数实现定制化需求。比如我们在函数 whatIsTheDay(year,month,date) 加入三个参数 year 、month 和 date ,告诉函数:“我想知道 某年、某月、某日 是周几 ”

以上是对编程思维的第四个训练:【模块化】分产承包,责任到户;结果导向,过程自理。

坑:

贵圈太乱

函数的调用关系复杂,你调我,它调你,你调你自己……

参数传递和返回结果

参数传递引入了新变量(认知内存中又要处理多一套对应关系 >_<),容易跟全局变量、函数内的局部变量混淆。而返回结果又是一个隐式的变量,不可见但影响重大。

交叉并行路径

如果只有一个明确起点,调用关系也单纯的程序就很好办。但事实往往是有多个起点入口,调用关系也复杂,偏偏程序是线性写下来的,不能按照从头到尾的顺序去读。于是到底程序从哪里开始,zeng 地蹿到了哪里,很让人头疼……

自定义函数和内置函数

内置函数的说法不对,因为那时还没有了解类,所以觉得类似frame.start()这种东西从哪来的,就把丫们看成内置函数。因为丫们不是自己亲生的,所以经常觉得陌生,尤其搞不清楚丫们之间的关系。

填坑:

  • 明确函数功能,加注释

  • 牢记函数的输入(函数参数)和输出(返回值)

  • 多进行局部调试,print 函数返回值

  • 函数之间的调用关系,通过可视化帮助理解

五、类 vs 招聘职位

每一个类都包含属性(变量和值)和行为(函数)。对比一下:

JD(招聘职位描述):

WXG01-微信高级交互设计师(广州)

工作职责:

- 参与微信相关产品从概念到原型的设计过程,输出相关设计文档;
- 对产品持续进行设计优化,提升用户体验;
- 协调和推动可用性测试及用户研究,以验证现有和将来的功能设计;
- 负责设计前瞻性的相关研究。

工作要求:

- 工业设计、心理学、计算机、视觉传达相关背景,本科及以上学历;
- 3年以上工作经验,主导过1000万+用户的移动互联网产品的设计,具备多领域设计工作相关经验,如产品设计、硬件设计、视觉设计等;
- 对互联网交互设计有深刻理解,具备完整的理论和技术体系;
- 优秀的产品意识,良好的全局观、前瞻性和判断力;
- 同理心强烈,擅长换位及独立思考,卓越的情景还原能力;
- 优秀的沟通、组织和项目管理能力;
- 性格乐观向上,兴趣爱好广泛。

类:

class Character:
def __init__(self, name, initial_health): # __int__ 初始化对象
self.name = name # self 是新的对象的引用
self.health = initial_health # name 和 health 是self对象中的域(field)
self.inventory = []

def __str__(self):
s = “Name: ” + self.name
s += ” Health: ” + str(self.health)
s += ” Inventory: ” + str(self.inventory)
return s

def grab(self, item): # methond defines the behaviors of objects
self.inventory.append(item)

def get_health(self): # method 所有方法的第一个参数都是self
return self.health

工作要求其实就相当于类的“属性”,作为这类人,本身需要具备什么样的条件和素质;工作职责相当于类的“行为”,这类人要干什么事情。

类和函数的区别在于,类只能操作某个类型的对象,而不能通过其他方法直接被调用。

面向对象编程的强大之处,对于一个类,理解其接口和已实现的方法,就可以使用了。

这是对编程思维的第五个训练:【面向对象】:打包成型,封装上架

坑:还没有真正练习过 囧,待踩。

今天先到这~ 可能有很多不恰当的类别,请各位程序猿轻拍~


建议继续学习

  1. 我是如何学习计算机编程的 (阅读 181,021)
  2. 面向“接口”编程和面向“实现”编程 (阅读 13,761)
  3. 我学编程时犯的最大两个错误 (阅读 7,862)
  4. 提高编程技能最有效的方法 (阅读 6,402)
  5. 函数式编程很难,这正是你要学习它的原因 (阅读 5,302)
  6. 如果你看不见你还能编程吗? (阅读 4,903)
  7. 那些曾伴我走过编程之路的软件 (阅读 4,763)
  8. 函数式编程 (阅读 4,585)
  9. 你从未听说过的一种编程方式 (阅读 4,302)
  10. 也谈编程改革 (阅读 4,241)