当前位置: 首页 > news >正文

程序员是如何思考的?

1975 年,弗雷德里克·布鲁克斯(Frederick Brooks)出版了软件行业的名著《人月神话》,他给出了一个统计结果,优秀程序员的开发效率是普通程序员的 10 倍。40 多年过去了,这个数字得到了行业的普遍认同。    

    成为优秀程序员是很多程序员的追求。但工作产出并不只是由写代码的效率决定的,一些不恰当工作方法很大程度上影响着你的产出。

    作为一个程序员,该如何更高效地工作,怎样才能把时间和精力尽可能地放在处理本质复杂度的事情上,减少在偶然复杂度上的消耗。

    首先,需要思考三个问题:

  1. 我现在是个什么水平?

  2. 我想达到一个什么水平?

  3. 我将怎样到达那个目标?

    很多人“最擅长”的是回答第一个问题:我现在处于什么水平?和有经验的人相比,他们大多自认为比较“菜”。但对于后两个问题的讨论,却可以切实看出人和人之间处理问题的能力差异。

    有人对自己的未来有了一个打算。比如想成为一个研发大牛,或者想做一个开源软件等,也就是说,对于第二个问题,他有明确的答案。

    有的人则是一脸茫然,他很可能根本没有考虑过这个问题。而从题目本身来看,目标相对清晰的同学,才会进入到第三个问题,而茫然的同学,则完全无从下手。

    如果大家跳出现有的思考模式,摆脱仅凭直觉“闷头做事”的习惯方式,把低着的头抬起来,看一眼未来,给自己找一个方向。

    否则,如果你对未来没有定位,是茫然的,尽管你也知道要努力,但劲儿该往哪里使呢?如果使劲的方向不对,那么你越使劲儿,可能会在错误的路上跑得越远。南辕北辙的道理大家都懂,但具体到自己的工作和发展上,真正能体会并实践的却是少数。

这三个问题实际上是帮我们确定:

  • 现状

  • 目标

  • 实现路径

    如果一个人能够清晰地回答出这三个问题,通常意味着他对要做的事有着清晰的认识。

    在实际的工作中,这个三个问题会帮助我更好地了解自己的工作。比如,当一个产品经理给我交代一个要开发的功能特性时,我通常会问他这样一些问题:

  • 为什么要做这个特性,它会给用户带来怎样的价值?

  • 什么样的用户会用到这个特性,他们在什么场景下使用,他们又会怎样使用它?

  • 达成这个目的是否有其它手段?是不是一定要开发一个系统?

  • 这个特性上线之后,怎么衡量它的有效性?

    如果产品经理能够回答好这些问题,说明他基本上已经把这个工作想得比较清楚了,这个时候,我才会放心地去了解后续的细节。

     一般来说,一个新特性要开发时,现状我是知道的。所以,我更关心目标,这里“为什么要做这个特性?”就是在问目标,“给用户带来怎样的价值”是在确定这个目标的有效性。

    接下来,我会关注实现路径,用户会怎么用,是否有其他的替代手段,我需要了解产品经理的设计是经过思考的,还是“拍着脑袋”给出的。衡量有效性,则是要保证我的工作不会被浪费。

    给出这三个问题是为了让你明白为什么要提出问题,而具体问题要怎么问,就可以遵循下面这四项原则:

  • 以终为始;

  • 任务分解

  • 沟通反馈

  • 自动化

    以终为始就是在工作的一开始就确定好自己的目标。我们需要看到的是真正的目标,而不是把别人交代给我们的工作当作目标。

    任务分解是将大目标拆分成一个一个可行的执行任务,工作分解得越细致,我们便越能更好地掌控工作

    沟通反馈是为了疏通与其他人交互的渠道。一方面,我们保证信息能够传达出去,减少因为理解偏差造成的工作疏漏;另一方面,也要保证我们能够准确接收外部信息,以免因为自我感觉良好,阻碍了进步。

    自动化就是将繁琐的工作通过自动化的方式交给机器执行,这是我们程序员本职工作的一部分,我们擅长的是为其他人打造自动化的服务,但自己的工作却应用得不够,这也是我们工作中最值得优化的部分。

    这四个原则互相配合,形成了一个对事情的衡量标准。总体上可以保证我的工作是有效的,在明确目标和完成目标的过程中,都可以尽量减少偶然复杂度。

    怎么把这四个原则用在工作中呢?我们回过头来看一下前面的场景,产品经理把要做的功能特性摆在我面前。站在以终为始的角度,我需要了解真正的目标是什么,所以,我会关心为什么要做这个特性。为了保证目标是有效的,我会关心它给用户带来的价值。

    有了任务分解的视角,我需要将一个大的目标进行拆解,如果我要达成这个目标,整体解决方案是远远不够的,我需要把任务分解成一个一个小的部分。所以,我会关心一个一个具体的使用场景。

    一方面,我会了解到更多的细节,另一方面,当时间紧迫的时候,我会和产品经理来谈谈究竟优先实现哪个场景。

    为什么要学会沟通反馈?因为我需要明确,自己是否真正理解了产品经理提交的需求。所以,我要不断地问问题,确保自己的理解和产品经理交代的内容一致。

    另外,我也需要保证我的产品做出来确实能够达到目标。所以,我会关心它上线后的衡量手段。因为我知道,这个行业里有太多代码上线后,从来没有运行过。

    自动化的角度很有意思,我们做的方案通常是一个自动化方案,但我们需要了解这个方案没有自动化之前是怎么做的。如果不自动化,用户会怎么用。所以,我会关心是不是还有其它替换方案,比如,买一个现成的服务。因为很多需求的提出,只是因为我们有了一个开发团队而已。

    因此,我们不是一个人孤独地在工作,而是与其他人在协作,想要做到高效工作,我们就要“抬起头”来,跳出写代码这件事本身。所以,程序员解决的问题,大多不是程序问题。    

相关文章:

  • 51. new 操作符的实现原理?
  • ArcGIS模拟风场(流场)
  • 【Pytorch】torch. bmm()
  • 并发编程模型
  • 使用Mindspore运行Resnet50Imagenet
  • 基于springboot+vue的在线作业管理考试系统 elementui
  • 07、Metasploit渗透测试框架的基本使用
  • DUBBO版本差异
  • 现在的数字藏品该怎么玩才不会被割韭菜?
  • LeetCode_双指针_中等_611.有效三角形的个数
  • 代理模式——静态代理和动态代理
  • 时域中的离散时间信号02—详解离散卷积
  • 一个Kbuild工程生成多个ko文件及其在驱动单元测试上的应用
  • 计算机毕业设计java毕业设计项目源代码精品SSM学生选课系统[包运行成功]
  • 1-4 数组元素的区间删除
  • 2017-09-12 前端日报
  • CSS实用技巧干货
  • eclipse的离线汉化
  • hadoop集群管理系统搭建规划说明
  • Laravel深入学习6 - 应用体系结构:解耦事件处理器
  • Redis字符串类型内部编码剖析
  • webpack+react项目初体验——记录我的webpack环境配置
  • 阿里云前端周刊 - 第 26 期
  • 不用申请服务号就可以开发微信支付/支付宝/QQ钱包支付!附:直接可用的代码+demo...
  • 二维平面内的碰撞检测【一】
  • 好的网址,关于.net 4.0 ,vs 2010
  • 排序(1):冒泡排序
  • 前端设计模式
  • 软件开发学习的5大技巧,你知道吗?
  • 微服务核心架构梳理
  • 温故知新之javascript面向对象
  • 项目管理碎碎念系列之一:干系人管理
  • 最简单的无缝轮播
  • 最近的计划
  • 你学不懂C语言,是因为不懂编写C程序的7个步骤 ...
  • ​业务双活的数据切换思路设计(下)
  • #[Composer学习笔记]Part1:安装composer并通过composer创建一个项目
  • (70min)字节暑假实习二面(已挂)
  • (附源码)springboot 智能停车场系统 毕业设计065415
  • (附源码)流浪动物保护平台的设计与实现 毕业设计 161154
  • (十七)devops持续集成开发——使用jenkins流水线pipeline方式发布一个微服务项目
  • (一)基于IDEA的JAVA基础10
  • (中等) HDU 4370 0 or 1,建模+Dijkstra。
  • (转)PlayerPrefs在Windows下存到哪里去了?
  • (转)四层和七层负载均衡的区别
  • .NET 8.0 发布到 IIS
  • .NET MVC第三章、三种传值方式
  • .Net通用分页类(存储过程分页版,可以选择页码的显示样式,且有中英选择)
  • @modelattribute注解用postman测试怎么传参_接口测试之问题挖掘
  • @reference注解_Dubbo配置参考手册之dubbo:reference
  • @vue/cli脚手架
  • [100天算法】-x 的平方根(day 61)
  • [Android]使用Retrofit进行网络请求
  • [bug总结]: Feign调用GET请求找不到请求体实体类
  • [hive] sql中distinct的用法和注意事项