用手机的相机照相,你不需要了解摄像头、闪光灯、图像处理,只要调用一个 API 就可以完成拍摄一张照片的任务。
用 Qt 的按钮响应用户鼠标,你只需要连接到 clicked 槽,用户点击按钮,你就可以响应用户。
类似这些,在我们的编程过程中天天发生。这是黑盒思维:即关注输入和输出,不关注中间环节,只要输入正确时输出符合预期即可。
与此同时,你写的代码,又必须做一些细节性的工作,比如连接别人的接口、实现自己的响应代码,这样才能在用户点击按钮时做出正确的反应,而不是毫无反应。类似下面这样:
在这个维度,你是在做白盒类的工作。
当你的工作完成,软件交付用户,用户使用时,又是黑盒式的:他只关注如何使用软件来完成自己的业务,不关注你里面是用 C++ 、Java 还是 Node.js 实现的。
而如果他关注这些,不停地要求 Review 你的代码,让你给他讲某个按钮是怎么用 C++ 代码创建出来的,那你肯定会觉得这个用户打破了黑盒的边界,“脑子有毛病”,拎不清轻重。
类似的是,如果你在使用 QPushButton 来构造一个按钮时,不去想怎么使用,而是一直拉着 Qt 的开发者问他们这个 QPushButton 的 clicked 信号是怎么发射出来的,它的 qss 是怎么一点点设计并实现的,那他们估计心里也会骂你“脑子有毛病啊,你又不做 Qt SDK 开发,知道怎么用不就好了”。
你看,黑盒、白盒,交织在我们的开发工作中,你每天都在用这两种思维来工作,当你很好的区分了什么时候该用黑盒思维、什么时候该用白盒思维,你就能比较顺畅地完成软件开发工作。而当你混淆两者,该黑盒时白盒,该白盒时却又想偷懒找黑盒,就会陷入无穷无尽的麻烦。
1:
黑盒、白盒代表了软件开发中的两种界限模式。合理划分界限,该黑盒时黑盒,当白盒时白盒,这是我们经由日复一日的开发工作养成的习惯。这种习惯,可以迁移到我们工作和生活中与人交互的场景中。
举个例子,你是项目经理,你分配某个模块给一个开发者,告诉他有哪些资源可以用,告诉他结果应该是什么样子,然后他拥有了一个任务,在接下来的一段时间自主去完成这个任务,按时交付。
很多新上任的技术管理者会采用白盒模式来做项目管理。他告诉开发者,登录页面对应的源码文件名必须是 login.cpp ,登录按钮的响应函数的名字必须是 userClickedLoginButton,写成 onLoginButtonClicked 万万不成……诸如此类,事无巨细,样样参与。
这样搞下来,开发者就会有“不被信任”、“不被尊重”、“被冒犯”、“代码不是自己的”等等感觉,进而就会放弃对这个模块代码的拥有权,你不是要管吗,都给你,爱咋咋地,然后,接下来,他也不会对这个模块有责任感,是好是坏他都不会觉得是自己的责任,会认为这是你的事儿,该由你负责。
然后,技术管理者就会越搞越累,发现自己操碎了心,事情没搞好不说,还弄得大家伙怨声载道士气低迷。
这其实是授权模式不正确,错误地采用了白盒授权模式,把开发者当作了自己的另一双手,关注细节太多,发出指令太多。而如果换成黑盒授权模式,情况就会有非常大的变化。
如图所示,任务由开发者认领后,技术管理者就不再一一过问细节,不关注他给一个变量起了什么名字,也不关注他给一个类起了什么名字,放手让开发者自己去做,你只关注他在什么节点交付什么东西,重点关注他提交的代码能否和其他人整合在一起、是否能达到预期效果。
这是黑盒的授权模式。
在这种模式下,开发者能按自己的方式去完成任务实现目标,会有掌控感,能激发自主性,自动寻路前进,遇到困难也会焕发责任感去解决。
2:
黑盒和白盒这两种思维,不但可以用在项目管理上,也可以用在生活中。
比如一个小媳妇和老公,周六中午准备在家做一荤两素三菜一汤,小媳妇早上起来洗了脸,敷上面膜,吩咐老公去卜蜂莲花超市买东西,叮嘱老公别逛太久,最好一个小时内买齐东西回家。
老公问买什么,小媳妇说你到那儿给我电话,我告诉你。老公就走了。
过了一阵子,两人开始通电话。
先是买肉,小媳妇说:“买黑猪肉,要前腿,不要后退,6两就够了,卖肉的位置,一进超市门,对啦,你走南门了吗?走南门的话,进去,靠右走,一直走到最里面——什么你走的北门?你为什么走北门?我们家里南门近啊,你脑子有毛病啊你走北门——好好好,从北门说,你走北门的话,一进去,先左拐——什么东西啊,我说的左右,你明白吗,我搞不清方向,别和我说东西南北,你往左拐,走到头,到卖酸奶那里,往右拐,一直往前走——说什么南北,别捣乱,往前——哎呀你怎么这笨啊分不清方向,不是南,是前,往前走……”
后来买豆芽,小媳妇说:“看好日期,看看是不是今天的,不是今天的,就买昨天的,不是昨天的,就不新鲜了,你要再找找今天的,实在找不到,就再找昨天的——哦,对啦,有三种牌子的豆芽,一种散称的,两种袋装的,要是袋装的没有,就买散称的,买散称的,你要看看根儿黑了没,别挑杆太肥的……”
后来小媳妇生气了,对着茶几上的电话吼起来:“哎呀你怎么这么笨啊,连豆芽肥肉都区分不出来——喂——喂——气死我啦,居然敢挂我电话?气死我啦,面膜白做了,一气老三年——”
Ok,如果你是这位老公,会感到沮丧吗?会感觉戳气吗?会想摔电话吗?
这就是白盒方式带来的效果,小媳妇生气,老公沮丧、挫败。
你看,一念之差,错用白盒,整死老公,气死自己,多不值得啊。如果小媳妇心念一转,换用黑盒模式,给老公列一张清单,像下面这样:
然后告诉老公,现在 9 点 45,你 11 点之前赶回家就成。
然后,结果可能就变化了:老公就高高兴兴地去超市买了清单上所有东西,还捎带着买了两罐黑啤一盒牛奶回来。
3:
再举个孩子写作业的例子。
小学一、二年级,陪伴孩子写作业是对妈妈们的一个大考验。
有一天语文老师布置了看图写话,妈妈搬个小板凳,坐旁边陪孩子。孩子看看妈妈,没说话,认真写自己的。
妈妈说:“别这样握笔,姿势不对。”
孩子重新握好铅笔。
妈妈又说:“往上拿点,离笔尖太近了,看不见写的字了。”
孩子往上拿点。
妈妈再说:“停下停下,这个字间架结构不对,单人旁应该只站四分之一格,你占了一半……”
孩子擦掉写好的“住”字,重新写一遍。
妈妈还说:“等等,这个顶格了,别顶格知道吗,告诉你多少回了,要留点空隙,顶格不好看!擦了,重写!”
……
孩子愤怒了:“妈——你一直说说说,烦不烦啊你!我都写不下去了,老被你打断,一句话都想不出来了!你写得好,你写吧!我不写啦!”
妈妈回怼:“我说你是为你好,说你两句怎么啦?还不能说啦?你要是字写得漂漂亮亮,我会说你?快,赶紧给我写!写不完不许睡觉!”
就这样,两个人把写作业这件事情闹得很不愉快。
这位妈妈搞错了一件事情:看图写话、写作文,是需要专注和沉浸的,应该给孩子一个黑盒环境,不要频繁地干扰他中断他,让他写完了给你读、给你看,然后再检查字迹这些细节。
4:
我们举了买菜、陪孩子写作业,都是说要黑盒不要白盒,但并不是说,你要不管三七二十一什么时候都用黑盒,有些场景,你必须得用白盒。
还是说孩子教育这件事。
不少爸爸在孩子教育这件大事上,往往陷入黑盒思维不能自拔:送学校,老师教;送兴趣班,老师教;请私教,老师教;放家里,爷爷奶奶带;给老婆,老婆管……
转眼孩子五年级了,马上要毕业考初中了,爸爸有一天看到孩子区考的成绩单,忽然不满意了:“老师怎么教你的?你妈怎么教你的?啊——老子天天忙里忙外挣钱供着你,要什么有什么,你给我考这样!”
一通臭骂后,孩子爸爸又想到了办法:“我给你报个补习班,每周日都给我上,直到成绩提上来,要是明年考不上重点中学,看老子怎么收拾你!”
这位爸爸,是不是应该转换一下自己的思维,适度采用白盒模式,参与到孩子的教养过程中来?
所以,黑盒、白盒两种思维,要结合具体场景,哪种更有利于事情往好的方向发展,就用哪种,如果两种结合更好,那就组合起来使用。
5:
那么,怎么区分黑盒好还是白盒好呢?
试着这么问问自己,如果让某某自己寻路完成事情:
1. 结局会怎么样?
2. 他能获得什么?
3. 我能获得什么?
答案往往会在你认真思考后浮现出来。