袁红岗的编程感悟

2023-11-19

"我自己知道,近几年也一直在用,但就是说不出来,直到最近几天才能够表达"--叫作Think in Code,也就是用代码思考,同时也把代码当成自己思想表达的方式。正如哲学家用文字设计、诠释思想,程序员'说话'用的是代码,这就是一个程序员的境 界,也只有代码是无歧义的"。

--究竟要怎样的努力才能做到像你一样?

--就是时间,我觉得任何人写十几年的程序,估计都能和我差不多。做程序员,很多人会觉得是吃青春饭的,但我要说,如果大家能静下心来做到三十几岁,一定会发觉这是十分惬意的一件事情。

袁红岗话不多,和其他同事站在一起,穿着简直可以用随便来形容。不经介绍,你一定不会想到面前这个"老袁"就是中国Java及J2EE核心技术领域公认的技术权威,金蝶中间件的首席科学家。

"那些都只是虚名而已",老袁平静地说。

36岁的老袁其实并不老,但十几年的程序员生涯却足够资深。他的"作品"包括:行业内最早基于Windows平台的财务软件;国内最早的基于三层结构技术的应用软件系统;国内首家拥有完全自主知识产权并通过国际J2EE认证的应用服务器……

"编而优则不仕",老袁的想法仍是程序员本色:"回过头来看,所做产品卖了很多,说明中国有那么多人在用我们写的程序,这才是最有成就感的。如果我做管理工作,那就默默无闻了,就算做到比较高的管理位置又能怎样?"

"那究竟要怎样的努力才能做到像你一样?""就是时间,我觉得任何人写十几年的程序,估计都能和我差不多。做程序员,很多人会觉得是吃青春饭的,但我要说,如果大家能静下心来做到三十几岁,一定会发觉这是十分惬意的一件事情"。

没有捷径,但有方法

做 一个程序员,老袁不爱谈技术,而以讲究方法著称。几年前,老袁曾在网上发了个贴子,谈《做程序员的基本原则》,结果短时间内的访问量居然达到了数十万次之 多,成为名副其实的精华贴。方法对于程序员的重要性,用那里头的一句话来说,就是"世界上并没有成为高手的捷径,但一些基本原则是可以遵循的"。

最近见到老袁,他最得意的却是自己才总结出来的"编程思想"---"我自己知道,近几年也一直在用,但就是说不出来,直到最近几天才能够表达"---叫作Think in Code。

所谓的Think in Code,也就是用代码思考,同时也把代码当成自己思想表达的方式。在老袁看来,正如哲学家用文字设计、诠释思想,程序员"说话"用的是代码,这就是一个程序员的境界。"也只有代码是无歧义的"。

如 今的老袁写起程序,一来"在设计的时候,不需要任何其他的开发工具,只需要代码,对象设计、功能设计都可以直接定义,用代码方式表达出来",二来"写到后 来不再需要另外的文档了,写的东西已经表达了我的思想"。设计或是编码,可以自顶向下,自底向上,或者两者融合,都可以自由选择。很有点随心所欲的境界。

如果选择了自顶向下的设计路径,老袁就会把最高层的这些接口设计好,下面的细节就暂时放着,留待日后细化,反之亦然。等程序的代码结构有 了,再将这尚不可交付的代码结构做一个测试、重构,找出里面的缺陷,优化里头的细节,使代码更加合理简洁,变成一个可交付的版本。每天大家都下班后,老袁 启动一个自动编译和测试的程序,第二天一来,就知道自己前一天的工作里面有没有什么错误。

同样,老袁也对一些标准化的软件开发模型很不 感冒,比如CMM认证之类。在老袁看来,过于规划化的流程把软件开发变成了一种很不自然的事情。老袁更喜欢一种循环开发的模式,写程序的时候,软件的设 计、编码、测试都融合在一起进行,而不是像传统的软件工程方法那样分阶段,一定要概要设计→详细设计→编码→测试,完全完成前一阶段才能进行下一个阶段。 "设计、编码、测试,不是阶段,而是过程,设计的时候也可以编码,编码完了就可以测试,为什么一定要所有编码完了才能测试或是所有设计完成才可以编码呢? "

找到合适自己的方法

同事说,"老袁在创新上一直是我们追赶的对象,程序员是很讲究创新的,很多程序员一开始是跟着人家走,学一些工具并满足于此,但是老袁能自创一派。"

老袁说,"其实我以前也学过很多的方法,比如UMT,CMM学了很久,但是始终用不起来,感觉这些方法还是不适合我,所以每个人都应该找到自己适合的方法。"

那怎么来找自己的方法?"不要轻易相信别人的方法。经常说如何好,我就怀疑,是不是真的用了这套东西之后开发能力就提高了呢?"

说起来轻松,但真正的寻找过程注定充满了艰辛。找到了,成为"开宗立派"的大师,找不到,则只能在模仿小空间里绕圈子。

老袁在学校里就开始编程了,"那已经是真正的项目"。这也让老袁早早地在同龄人中间开始拔尖。从那之后到1994年,在老袁看来是自己学习、摸索,模仿的阶段,看了很多书,读了很多程序,自己也写,"但现在看起来确实是非常粗浅的"。

1994年,优秀程序员老袁进入金蝶公司,推出了不少大名鼎鼎的"作品",比如金蝶财务软件等。"在外人看来,这是一个非常辉煌的时代"。但是老袁却开始越来越郁闷---不是因为别的原因,"东西在别人看来写得非常好,但是自己却总是觉得再也无法提高了"。

曾经有一年多的时间,老袁说自己一点东西也写不出来,就是感觉跨不过去了。"当时也动过这样的念头:算了,不写程序了,不写程序就搞搞管理,日子也会很好过。"

那 段时间,老袁率领当时的金蝶中央研究院开始了J2EE架构的核心---J2EE应用服务器的研究和开发,成功开发出了国内首家拥有完全自主知识产权、通过 国际J2EE认证的应用服务器,并成为国际JCP组织中国代表。2000年,金蝶中间件公司成立,发布了金蝶Apusic应用服务器1.0版本,2001 年,老袁又把所有的架构体系推倒重来了一遍,这就是2001发布的2.0版。

这个2.0版的重构成了老袁程序员生涯的一个重要转折,可 谓从优秀到卓越。"这个时候就开始意识到做软件是要有思想的,要有思想来指导你。之前之所以遇到很大障碍,就是没有一套思想、方法论。凭借着对技术的掌握 自己还是写了一些软件,但是技术掌握得再多,没有好的方法,你仍然没法写出好的程序。"

就象是捅破了一层窗户纸。从那时候起,老袁的编 程工作就有了游刃有余的感觉。去年老袁在美国遇到一位敏捷编程方法的倡导者,被外界称为“软件开发教父”的Martin .Fowler,几句一聊,让老袁立刻有了知己之感。"这才发现世界上还有这么多程序员有和我一样的想法"。

这让老袁有了进一步总结自 己的编程理念的想法。"我的编程思想和敏捷编程很像,但又不完全是敏捷编程"。老袁希望自己在40岁之前,把Thinking in code说得更清楚些,更具可操作性,比如:如何用代码而不是用建模工具来设计,如何在设计的时候让代码来表现流程。如今老袁平时也带学生,但是只教方 法,不教技术,"有很多技术,他们比我还懂得多"。

 
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

袁红岗的编程感悟 的相关文章

  • QT文件读取路径

    最近在弄中兴的一个程序大赛 用QT读取XML文件的编程 在编程中发现QT文件读取路径与VS有不同之处 我们提供给QFile的文件路径无非就是绝对路径和相对路径 绝对路径是绝对没问题的 不过相对路径就得小心了 谈到相对路径 需要注意区分进程所
  • 工控上位机程序为什么只能用C语言?

    工控上位机程序并不只能用C 开发 实际上在工业自动化领域中 常见的上位机开发语言包括但不限于以下几种 C C 是一种常用的编程语言 在工控领域中被广泛使用 它具有良好的面向对象特性和丰富的类库支持 可以实现高性能的上位机程序开发 C C C
  • Python如何执行shell脚本

    Python如何执行shell脚本 自从出了Pyhon3 5之后 os模块下的system os popen 基本被废弃了 因此如下只介绍2种方式 一 使用commands模块 有三个方法可以使用 1 commands getstatuso
  • 自学软件测试需要多久?怎么自学软件测试?自学软件测试可以找到工作吗? 绝对干货!

    一 前言 最近经常有很多朋友问我想要入行软件测试 但是都不知道该怎么学 这里详细的给大家说下 对于0基础的朋友 应该怎么去学习软件测试 学习软件测试有2条路可以选 1 找个靠谱的培训机构去培训啦 你就什么都不用想了 跟着培训结构认真的学习就
  • Fortify 代码扫描安装使用教程

    前言 Fortify 能够提供静态和动态应用程序安全测试技术 以及运行时应用程序监控和保护功能 为实现高效安全监测 Fortify具有源代码安全分析 可精准定位漏洞产生的路径 以及具有1分钟1万行的扫描速度 Fortify SCA 支持丰富
  • Python中的any()和all()

    any any 函数采用iterable作为参数 any iterable 迭代器可以是列表 元组或字典 如果iterable中的所有元素为true 则any 函数将返回 True 但是 如果传递给该函数的Iterable为空 则返回 Fa
  • IntelliJ IDEA中如何使用JUnit4

    背景 最近参与了一个Anroid医疗项目 其中项目底层有很多基础类及通讯类 而且很多涉及复杂的字节操作还有多线程同步及状态机处理 这样的项目做一下TDD还是必要的 尽量项目前期把风险降低一些 现在的问题是本人使用的是IntelliJ开发的A
  • AngularJs单元测试

    这篇文章主要介绍了angularJS中的单元测试实例 本文主要介绍利用Karma和Jasmine来进行ng模块的单元测试 并用Istanbul 来生成代码覆盖率测试报告 需要的朋友们可以参考下 以下可全都是干货哦 当ng项目越来越大的时候
  • 多处理器编程的艺术(二)-并行程序设计

    当处理器的性能的发展受到各方面因素的限制的时候 计算机产业开始用多处理器结构实现并行计算来提高计算的效率 我们使用多处理器共享存储器的方式实现了多处理器编程 也就是多核编程 当然在这样的系统结构下我们面临着各种各样的挑战 例如如何协调各个处
  • 使用CUDA和CUFFT进行快速1D卷积的示例

    使用CUDA和CUFFT进行快速1D卷积的示例 在计算机视觉 数字信号处理和机器学习中 卷积是一种常见的操作 然而 卷积操作通常需要大量计算 因此需要一种高效的方法来完成 CUDA和CUFFT可以用于对使用FFT的快速1D卷积进行加速 在本
  • Qt实现窗口关闭时提示确认退出

    Qt实现窗口关闭时提示确认退出 在Qt中 当用户点击窗口关闭按钮时 程序会直接退出 这样可能会导致数据丢失或其他不必要的操作 为了提高用户体验 我们可以在窗口关闭前给出一个提示框 询问用户是否确认退出 一 实现思路 通过重写QWidget类
  • 腾讯、阿里多位大佬共同推荐!封神级Python学习路线+核心知识点笔

    人工智能时代下 Python毫无疑问是最热的编程语言 有人夸它功能强大还上手轻松 有人说它学习曲线不那么陡峭 但是更多的人 在推开Python的大门后却发现 Python入门容易但精通却不易 你是否也曾傻傻分不清 列表 元组 字典 集合 等
  • KMP比较简单的讲法。

    转载链接 http blog csdn net yearn520 article details 6729426 我们在一个母字符串中查找一个子字符串有很多方法 KMP是一种最常见的改进算法 它可以在匹配过程中失配的情况下 有效地多往后面跳
  • 网管员牢记 10种较为常见的服务器管理错误

    网管员牢记 10种较为常见的服务器管理错误 网络管理阶层的工作就是保证网络的正常工作 从而使得职工们的工作不被打断 可问题在于事物并非总是按照理想状况发展 事实上经常会出现平地起风波的状况 其间有许多原因 这里我们只讨论10种较为常见的网管
  • 编程杂感两篇

    一 Null是个巨大的错误吗 为null正名 null可以表示未初始化的引用 为什么不强迫初始化 因为初始化时可能抛异常 变量声明放进try块 又可能有跨作用域的需求 一种常见的做法是大改语法引入maybe关键字支持代数类型 并且函数做模式
  • 008-黑盒测试和白盒测试的优缺点

    黑盒测试和白盒测试的优缺点 黑盒测试的优点有 比较简单 不需要了解程序内部的代码及实现 与软件的内部实现无关 从用户角度出发 能很容易的知道用户会用到哪些功能 会遇到哪些问题 基于软件开发文档 所以也能知道软件实现了文档中的哪些功能 在做软
  • 使用Draw.io制作泳道图

    使用Draw io制作泳道图 一 横向泳道图 1 有标题泳道图 2 无标题泳道图 3 横纵向扩展泳道 二 纵向泳道图
  • C语言是否已经跟不上社会需求?

    今日话题 C语言是否已经跟不上社会需求 一个问题的提出者说 几天前他受到老板的批评 因为他只精通C语言编程 无法满足老板的需求 实际上 C语言在嵌入式行业中仍然具有极高的价值 它高效 可移植 并广泛用于嵌入式系统的开发 然而 嵌入式系统的多
  • Java的引用类型有几种?区别是什么?

    nbsp Java的引用类型有几种 区别是什么 在开始前我有一些资料 是我根据自己从业十年经验 熬夜搞了几个通宵 精心整理了一份 Java的资料从专业入门到高级教程 工具包 点个关注 全部无偿共享给大家 在评论区回复 888 之后私信回复
  • 为什么C语言没有被C++所取代呢?

    今日话题 为什么C语言没有被C 所取代呢 C 的复杂编译器实现和嵌入式平台的限制 使C语言保持了其地位 嵌入式系统多数仅支持C 即使支持C 也会限制某些功能 尤其是异常处理和RTTI 此外 C 引入的功能增加了二进制文件大小和运行时内存占用

随机推荐

  • 跟李沐学AI——动手学深度学习 PyTorch版——学习笔记pycharm版本(第四天——10、11、12、13、14)2023.3.1

    前言 这是沐神的第十节课 是讲多层感知机的 需要掌握牢固 以后会经常写的 代码讲解 跳过从零开始实现 直接进入简单代码的讲解 导入包 import torch from torch import nn from d2l import tor
  • Git的基本使用

    Git的基本使用 一 本文主要介绍Git 实现基本的代码托管 适合初次接触Git的开发人员 高级用法请查阅后续文章 目录 Git用途 Git代码托管平台 Git工作流程 概念介绍 工作流程 Git使用步骤 版本管理 分支管理 常用的分支命名
  • 《图解物联网》--阅读笔记

    第1 章物联网的基础知识1 1 1 物联网入门 2 1 1 1 物联网 2 1 1 2 物联网的相关动向 2 1 2 物联网所实现的世界 3 1 2 1 泛在网络 社会 3 1 2 2 物 的互联网连接 4 1 2 3 机器对机器通信所实现
  • Java String类型和BigDecimal类型之间的转化及BigDecimal类型的介绍

    String和BigDecimal的相互转化 String a 50 00 字符串类型 必须是数字 否则会报错 java lang NumberFormatException 异常 BigDecimal b new BigDecimal a
  • 汇编语言有如下的汇编程序段,请完成code段中的代码,实现将string1段和string2段中的数据拷贝到string3段中,并且将string3段中的数据输出到屏幕。

    有如下的汇编程序段 请完成code段中的代码 实现将string1段和string2段中的数据拷贝到string3段中 并且将string3段中的数据输出到屏幕 题目 有如下的汇编程序段 请完成code段中的代码 实现将string1段和s
  • Bose700降噪体验

    戴了多年耳塞 还是决定买一块主动降噪的看看 第一款主动降噪耳机当然选择降噪最强的bose700 直接官方旗舰店买不废话 虽然是主动降噪 不过众所周知是主要降低频部分1KHz以下 所以呢 给小白的用话小白会说 人声 喇叭声 风扇声都是听得到的
  • 学习动态规划-子矩阵

    1 全为1的最大正方形 在一个由 0 和 1 组成的二维矩阵内 找到只包含 1 的最大正方形 并返回其面积 来源 221 最大正方形 解题思路 dp i j 表示以matrix i j 为右下角的全1的正方形的最大边长 很明显 当matri
  • C++ 之 String类详解

    String 小引 string类常用接口 常见构造 容量操作 访问操作 修改操作 string类非成员函数 模拟实现 小引 C语言中 字符串是以 0结尾的一些字符的集合 为了操作方便 C标准库中提供了一些str系列的库函数 但是这些库函数
  • MAC Android Studio 克隆新项目出现问题及解决方法

    目录 前言 重装Android Studio 卸载Android Studio 安装Android Studio 打开新项目 前言 MAC OS 10 15 1 使用Android Studio打开GIT克隆下来的新项目 报错1 Could
  • VS2022 E1696 无法打开源文件报错修改

    1 先检查安装时的配件都安装正确了没有 在工具栏位置打开 获取工具和功能 此时会跳转到我们一开始安装VS时要安装配件的界面 在该界面内 检查是否是 使用C 的桌面开发 的安装选项 如果不是的话就选中该应用并选择下载路径进行修改下载 2 如果
  • C++-std::unique_lock介绍和简单使用

    unique lock std unique lock比std lock guard更灵活 这种灵活性主要体现在以下几点 lock guard在构造时或者构造前 std adopt lock 就已经获取互斥锁 并且在作用域内保持获取锁的状态
  • Linux系统的安装(在VM虚拟机上安装CentOS 7)

    工具准备 物理计算机一台 配置要求 操作系统 win10 64位 大家基本上都是 硬盘可用容量 20G以上 内存容量 4G以上 虚拟机安装包 VMware workstation full 12 5 下载链接 点我下载 提取码 9gha C
  • 为什么程序员招聘都要5年经验起?因为他们懂Java8底层优化!

    一 前情回顾 上篇文章给大家聊了一下volatile的原理 具体参见 入坑两个月自研非外包创业公司 居然让我搞懂了volatile 这篇文章给大家聊一下java并发包下的CAS相关的原子操作 以及Java 8如何改进和优化CAS操作的性能
  • 在Qt中如何实现窗口交互

    首先介绍done函数 它的作用是 关闭当前窗口 同时返回一个状态信息 Qt助手解释 关闭对话框并将其结果代码设置为r 如果这个对话框显示了exec done 导致本地事件循环结束 exec 返回r void QDialog done int
  • checkbox样式改写

    div class checkbox font s div
  • js 微观任务、宏观任务、循环机制

    javascript是单线程语言 就是因为单线程的特性 就不得不提js中的同步和异步 同步和异步 所谓单线程 无非就是同步队列和异步队列 js代码是自上向下执行的 在主线程中立即执行的就是同步任务 比如简单的逻辑操作及函数 而异步任务不会立
  • 计算机网络--绪论

    一 计网的体系结构 1 概念和功能 2 组成和分类 3 标准化工作及相关组织 二 性能指标 1 速率 2 带宽 3 吞吐量 4 时延 5 时延带宽积 6 往返时间RTT利用率 7 利用率 三 分层结构 1 分层 四 OSI参考模型 1 OS
  • 随机数产生方法

    5 产生一定范围随机数的通用表示公式 要取得 a b 的随机整数 使用 rand b a a 要取得 a b 的随机整数 使用 rand b a 1 a 要取得 a b 的随机整数 使用 rand b a a 1 通用公式 a rand n
  • 【Vue】Vue基础自用笔记&Day02_①Vue过滤器②按键修饰符③自定义指令

    Vue基础 Day02 1 Vue过滤器 2 按键修饰符 3 自定义Vue指令 1 Vue过滤器 Vue js 允许你自定义过滤器 可被用于一些常见的文本格式化 过滤器可以用在两个地方 双花括号 插值和 v bind 表达式 后者从 2 1
  • 袁红岗的编程感悟

    我自己知道 近几年也一直在用 但就是说不出来 直到最近几天才能够表达 叫作Think in Code 也就是用代码思考 同时也把代码当成自己思想表达的方式 正如哲学家用文字设计 诠释思想 程序员 说话 用的是代码 这就是一个程序员的境 界