mirror of
https://github.com/zhwei820/learn.lianglianglee.com.git
synced 2025-09-17 08:46:40 +08:00
1201 lines
34 KiB
HTML
1201 lines
34 KiB
HTML
<!DOCTYPE html>
|
||
|
||
<!-- saved from url=(0046)https://kaiiiz.github.io/hexo-theme-book-demo/ -->
|
||
|
||
<html xmlns="http://www.w3.org/1999/xhtml">
|
||
|
||
<head>
|
||
|
||
<head>
|
||
|
||
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
|
||
|
||
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1.0, user-scalable=no">
|
||
|
||
<link rel="icon" href="/static/favicon.png">
|
||
|
||
<title>25 有哪些方法可以提高开发效率?.md.html</title>
|
||
|
||
<!-- Spectre.css framework -->
|
||
|
||
<link rel="stylesheet" href="/static/index.css">
|
||
|
||
<!-- theme css & js -->
|
||
|
||
<meta name="generator" content="Hexo 4.2.0">
|
||
|
||
</head>
|
||
|
||
|
||
|
||
<body>
|
||
|
||
|
||
|
||
<div class="book-container">
|
||
|
||
<div class="book-sidebar">
|
||
|
||
<div class="book-brand">
|
||
|
||
<a href="/">
|
||
|
||
<img src="/static/favicon.png">
|
||
|
||
<span>技术文章摘抄</span>
|
||
|
||
</a>
|
||
|
||
</div>
|
||
|
||
<div class="book-menu uncollapsible">
|
||
|
||
<ul class="uncollapsible">
|
||
|
||
<li><a href="/" class="current-tab">首页</a></li>
|
||
|
||
</ul>
|
||
|
||
|
||
|
||
<ul class="uncollapsible">
|
||
|
||
<li><a href="../">上一级</a></li>
|
||
|
||
</ul>
|
||
|
||
|
||
|
||
<ul class="uncollapsible">
|
||
|
||
<li>
|
||
|
||
|
||
|
||
|
||
|
||
<a href="/专栏/软件工程之美/00 开篇词 你为什么应该学好软件工程?.md.html">00 开篇词 你为什么应该学好软件工程?.md.html</a>
|
||
|
||
|
||
|
||
</li>
|
||
|
||
<li>
|
||
|
||
|
||
|
||
|
||
|
||
<a href="/专栏/软件工程之美/01 到底应该怎样理解软件工程?.md.html">01 到底应该怎样理解软件工程?.md.html</a>
|
||
|
||
|
||
|
||
</li>
|
||
|
||
<li>
|
||
|
||
|
||
|
||
|
||
|
||
<a href="/专栏/软件工程之美/02 工程思维:把每件事都当作一个项目来推进.md.html">02 工程思维:把每件事都当作一个项目来推进.md.html</a>
|
||
|
||
|
||
|
||
</li>
|
||
|
||
<li>
|
||
|
||
|
||
|
||
|
||
|
||
<a href="/专栏/软件工程之美/03 瀑布模型:像工厂流水线一样把软件开发分层化.md.html">03 瀑布模型:像工厂流水线一样把软件开发分层化.md.html</a>
|
||
|
||
|
||
|
||
</li>
|
||
|
||
<li>
|
||
|
||
|
||
|
||
|
||
|
||
<a href="/专栏/软件工程之美/04 瀑布模型之外,还有哪些开发模型?.md.html">04 瀑布模型之外,还有哪些开发模型?.md.html</a>
|
||
|
||
|
||
|
||
</li>
|
||
|
||
<li>
|
||
|
||
|
||
|
||
|
||
|
||
<a href="/专栏/软件工程之美/05 敏捷开发到底是想解决什么问题?.md.html">05 敏捷开发到底是想解决什么问题?.md.html</a>
|
||
|
||
|
||
|
||
</li>
|
||
|
||
<li>
|
||
|
||
|
||
|
||
|
||
|
||
<a href="/专栏/软件工程之美/06 大厂都在用哪些敏捷方法?(上).md.html">06 大厂都在用哪些敏捷方法?(上).md.html</a>
|
||
|
||
|
||
|
||
</li>
|
||
|
||
<li>
|
||
|
||
|
||
|
||
|
||
|
||
<a href="/专栏/软件工程之美/07 大厂都在用哪些敏捷方法?(下).md.html">07 大厂都在用哪些敏捷方法?(下).md.html</a>
|
||
|
||
|
||
|
||
</li>
|
||
|
||
<li>
|
||
|
||
|
||
|
||
|
||
|
||
<a href="/专栏/软件工程之美/08 怎样平衡软件质量与时间成本范围的关系?.md.html">08 怎样平衡软件质量与时间成本范围的关系?.md.html</a>
|
||
|
||
|
||
|
||
</li>
|
||
|
||
<li>
|
||
|
||
|
||
|
||
|
||
|
||
<a href="/专栏/软件工程之美/09 为什么软件工程项目普遍不重视可行性分析?.md.html">09 为什么软件工程项目普遍不重视可行性分析?.md.html</a>
|
||
|
||
|
||
|
||
</li>
|
||
|
||
<li>
|
||
|
||
|
||
|
||
|
||
|
||
<a href="/专栏/软件工程之美/10 如果你想技术转管理,先来试试管好一个项目.md.html">10 如果你想技术转管理,先来试试管好一个项目.md.html</a>
|
||
|
||
|
||
|
||
</li>
|
||
|
||
<li>
|
||
|
||
|
||
|
||
|
||
|
||
<a href="/专栏/软件工程之美/11 项目计划:代码未动,计划先行.md.html">11 项目计划:代码未动,计划先行.md.html</a>
|
||
|
||
|
||
|
||
</li>
|
||
|
||
<li>
|
||
|
||
|
||
|
||
|
||
|
||
<a href="/专栏/软件工程之美/12 流程和规范:红绿灯不是约束,而是用来提高效率.md.html">12 流程和规范:红绿灯不是约束,而是用来提高效率.md.html</a>
|
||
|
||
|
||
|
||
</li>
|
||
|
||
<li>
|
||
|
||
|
||
|
||
|
||
|
||
<a href="/专栏/软件工程之美/13 白天开会,加班写代码的节奏怎么破?.md.html">13 白天开会,加班写代码的节奏怎么破?.md.html</a>
|
||
|
||
|
||
|
||
</li>
|
||
|
||
<li>
|
||
|
||
|
||
|
||
|
||
|
||
<a href="/专栏/软件工程之美/14 项目管理工具:一切管理问题,都应思考能否通过工具解决.md.html">14 项目管理工具:一切管理问题,都应思考能否通过工具解决.md.html</a>
|
||
|
||
|
||
|
||
</li>
|
||
|
||
<li>
|
||
|
||
|
||
|
||
|
||
|
||
<a href="/专栏/软件工程之美/15 风险管理:不能盲目乐观,凡事都应该有B计划.md.html">15 风险管理:不能盲目乐观,凡事都应该有B计划.md.html</a>
|
||
|
||
|
||
|
||
</li>
|
||
|
||
<li>
|
||
|
||
|
||
|
||
|
||
|
||
<a href="/专栏/软件工程之美/16 怎样才能写好项目文档?.md.html">16 怎样才能写好项目文档?.md.html</a>
|
||
|
||
|
||
|
||
</li>
|
||
|
||
<li>
|
||
|
||
|
||
|
||
|
||
|
||
<a href="/专栏/软件工程之美/17 需求分析到底要分析什么?怎么分析?.md.html">17 需求分析到底要分析什么?怎么分析?.md.html</a>
|
||
|
||
|
||
|
||
</li>
|
||
|
||
<li>
|
||
|
||
|
||
|
||
|
||
|
||
<a href="/专栏/软件工程之美/18 原型设计:如何用最小的代价完成产品特性?.md.html">18 原型设计:如何用最小的代价完成产品特性?.md.html</a>
|
||
|
||
|
||
|
||
</li>
|
||
|
||
<li>
|
||
|
||
|
||
|
||
|
||
|
||
<a href="/专栏/软件工程之美/19 作为程序员,你应该有产品意识.md.html">19 作为程序员,你应该有产品意识.md.html</a>
|
||
|
||
|
||
|
||
</li>
|
||
|
||
<li>
|
||
|
||
|
||
|
||
|
||
|
||
<a href="/专栏/软件工程之美/20 如何应对让人头疼的需求变更问题?.md.html">20 如何应对让人头疼的需求变更问题?.md.html</a>
|
||
|
||
|
||
|
||
</li>
|
||
|
||
<li>
|
||
|
||
|
||
|
||
|
||
|
||
<a href="/专栏/软件工程之美/21 架构设计:普通程序员也能实现复杂系统?.md.html">21 架构设计:普通程序员也能实现复杂系统?.md.html</a>
|
||
|
||
|
||
|
||
</li>
|
||
|
||
<li>
|
||
|
||
|
||
|
||
|
||
|
||
<a href="/专栏/软件工程之美/22 如何为项目做好技术选型?.md.html">22 如何为项目做好技术选型?.md.html</a>
|
||
|
||
|
||
|
||
</li>
|
||
|
||
<li>
|
||
|
||
|
||
|
||
|
||
|
||
<a href="/专栏/软件工程之美/23 架构师:不想当架构师的程序员不是好程序员.md.html">23 架构师:不想当架构师的程序员不是好程序员.md.html</a>
|
||
|
||
|
||
|
||
</li>
|
||
|
||
<li>
|
||
|
||
|
||
|
||
|
||
|
||
<a href="/专栏/软件工程之美/24 技术债务:是继续修修补补凑合着用,还是推翻重来?.md.html">24 技术债务:是继续修修补补凑合着用,还是推翻重来?.md.html</a>
|
||
|
||
|
||
|
||
</li>
|
||
|
||
<li>
|
||
|
||
|
||
|
||
<a class="current-tab" href="/专栏/软件工程之美/25 有哪些方法可以提高开发效率?.md.html">25 有哪些方法可以提高开发效率?.md.html</a>
|
||
|
||
|
||
|
||
|
||
|
||
</li>
|
||
|
||
<li>
|
||
|
||
|
||
|
||
|
||
|
||
<a href="/专栏/软件工程之美/26 持续交付:如何做到随时发布新版本到生产环境?.md.html">26 持续交付:如何做到随时发布新版本到生产环境?.md.html</a>
|
||
|
||
|
||
|
||
</li>
|
||
|
||
<li>
|
||
|
||
|
||
|
||
|
||
|
||
<a href="/专栏/软件工程之美/27 软件工程师的核心竞争力是什么?(上).md.html">27 软件工程师的核心竞争力是什么?(上).md.html</a>
|
||
|
||
|
||
|
||
</li>
|
||
|
||
<li>
|
||
|
||
|
||
|
||
|
||
|
||
<a href="/专栏/软件工程之美/28 软件工程师的核心竞争力是什么?(下).md.html">28 软件工程师的核心竞争力是什么?(下).md.html</a>
|
||
|
||
|
||
|
||
</li>
|
||
|
||
<li>
|
||
|
||
|
||
|
||
|
||
|
||
<a href="/专栏/软件工程之美/29 自动化测试:如何把Bug杀死在摇篮里?.md.html">29 自动化测试:如何把Bug杀死在摇篮里?.md.html</a>
|
||
|
||
|
||
|
||
</li>
|
||
|
||
<li>
|
||
|
||
|
||
|
||
|
||
|
||
<a href="/专栏/软件工程之美/30 用好源代码管理工具,让你的协作更高效.md.html">30 用好源代码管理工具,让你的协作更高效.md.html</a>
|
||
|
||
|
||
|
||
</li>
|
||
|
||
<li>
|
||
|
||
|
||
|
||
|
||
|
||
<a href="/专栏/软件工程之美/31 软件测试要为产品质量负责吗?.md.html">31 软件测试要为产品质量负责吗?.md.html</a>
|
||
|
||
|
||
|
||
</li>
|
||
|
||
<li>
|
||
|
||
|
||
|
||
|
||
|
||
<a href="/专栏/软件工程之美/32 软件测试:什么样的公司需要专职测试?.md.html">32 软件测试:什么样的公司需要专职测试?.md.html</a>
|
||
|
||
|
||
|
||
</li>
|
||
|
||
<li>
|
||
|
||
|
||
|
||
|
||
|
||
<a href="/专栏/软件工程之美/33 测试工具:为什么不应该通过QQ微信邮件报Bug?.md.html">33 测试工具:为什么不应该通过QQ微信邮件报Bug?.md.html</a>
|
||
|
||
|
||
|
||
</li>
|
||
|
||
<li>
|
||
|
||
|
||
|
||
|
||
|
||
<a href="/专栏/软件工程之美/34 账号密码泄露成灾,应该怎样预防?.md.html">34 账号密码泄露成灾,应该怎样预防?.md.html</a>
|
||
|
||
|
||
|
||
</li>
|
||
|
||
<li>
|
||
|
||
|
||
|
||
|
||
|
||
<a href="/专栏/软件工程之美/35 版本发布:软件上线只是新的开始.md.html">35 版本发布:软件上线只是新的开始.md.html</a>
|
||
|
||
|
||
|
||
</li>
|
||
|
||
<li>
|
||
|
||
|
||
|
||
|
||
|
||
<a href="/专栏/软件工程之美/36 DevOps工程师到底要做什么事情?.md.html">36 DevOps工程师到底要做什么事情?.md.html</a>
|
||
|
||
|
||
|
||
</li>
|
||
|
||
<li>
|
||
|
||
|
||
|
||
|
||
|
||
<a href="/专栏/软件工程之美/37 遇到线上故障,你和高手的差距在哪里?.md.html">37 遇到线上故障,你和高手的差距在哪里?.md.html</a>
|
||
|
||
|
||
|
||
</li>
|
||
|
||
<li>
|
||
|
||
|
||
|
||
|
||
|
||
<a href="/专栏/软件工程之美/38 日志管理:如何借助工具快速发现和定位产品问题 ?.md.html">38 日志管理:如何借助工具快速发现和定位产品问题 ?.md.html</a>
|
||
|
||
|
||
|
||
</li>
|
||
|
||
<li>
|
||
|
||
|
||
|
||
|
||
|
||
<a href="/专栏/软件工程之美/39 项目总结:做好项目复盘,把经验变成能力.md.html">39 项目总结:做好项目复盘,把经验变成能力.md.html</a>
|
||
|
||
|
||
|
||
</li>
|
||
|
||
<li>
|
||
|
||
|
||
|
||
|
||
|
||
<a href="/专栏/软件工程之美/40 最佳实践:小团队如何应用软件工程?.md.html">40 最佳实践:小团队如何应用软件工程?.md.html</a>
|
||
|
||
|
||
|
||
</li>
|
||
|
||
<li>
|
||
|
||
|
||
|
||
|
||
|
||
<a href="/专栏/软件工程之美/41 为什么程序员的业余项目大多都死了?.md.html">41 为什么程序员的业余项目大多都死了?.md.html</a>
|
||
|
||
|
||
|
||
</li>
|
||
|
||
<li>
|
||
|
||
|
||
|
||
|
||
|
||
<a href="/专栏/软件工程之美/42 反面案例:盘点那些失败的软件项目.md.html">42 反面案例:盘点那些失败的软件项目.md.html</a>
|
||
|
||
|
||
|
||
</li>
|
||
|
||
<li>
|
||
|
||
|
||
|
||
|
||
|
||
<a href="/专栏/软件工程之美/43 以VS Code为例,看大型开源项目是如何应用软件工程的?.md.html">43 以VS Code为例,看大型开源项目是如何应用软件工程的?.md.html</a>
|
||
|
||
|
||
|
||
</li>
|
||
|
||
<li>
|
||
|
||
|
||
|
||
|
||
|
||
<a href="/专栏/软件工程之美/44 微软、谷歌、阿里巴巴等大厂是怎样应用软件工程的?.md.html">44 微软、谷歌、阿里巴巴等大厂是怎样应用软件工程的?.md.html</a>
|
||
|
||
|
||
|
||
</li>
|
||
|
||
<li>
|
||
|
||
|
||
|
||
|
||
|
||
<a href="/专栏/软件工程之美/45 从软件工程的角度看微服务、云计算、人工智能这些新技术.md.html">45 从软件工程的角度看微服务、云计算、人工智能这些新技术.md.html</a>
|
||
|
||
|
||
|
||
</li>
|
||
|
||
<li>
|
||
|
||
|
||
|
||
|
||
|
||
<a href="/专栏/软件工程之美/一问一答第1期 30个软件开发常见问题解决策略.md.html">一问一答第1期 30个软件开发常见问题解决策略.md.html</a>
|
||
|
||
|
||
|
||
</li>
|
||
|
||
<li>
|
||
|
||
|
||
|
||
|
||
|
||
<a href="/专栏/软件工程之美/一问一答第2期 30个软件开发常见问题解决策略.md.html">一问一答第2期 30个软件开发常见问题解决策略.md.html</a>
|
||
|
||
|
||
|
||
</li>
|
||
|
||
<li>
|
||
|
||
|
||
|
||
|
||
|
||
<a href="/专栏/软件工程之美/一问一答第3期 18个软件开发常见问题解决策略.md.html">一问一答第3期 18个软件开发常见问题解决策略.md.html</a>
|
||
|
||
|
||
|
||
</li>
|
||
|
||
<li>
|
||
|
||
|
||
|
||
|
||
|
||
<a href="/专栏/软件工程之美/一问一答第4期 14个软件开发常见问题解决策略.md.html">一问一答第4期 14个软件开发常见问题解决策略.md.html</a>
|
||
|
||
|
||
|
||
</li>
|
||
|
||
<li>
|
||
|
||
|
||
|
||
|
||
|
||
<a href="/专栏/软件工程之美/一问一答第5期 22个软件开发常见问题解决策略.md.html">一问一答第5期 22个软件开发常见问题解决策略.md.html</a>
|
||
|
||
|
||
|
||
</li>
|
||
|
||
<li>
|
||
|
||
|
||
|
||
|
||
|
||
<a href="/专栏/软件工程之美/学习攻略 怎样学好软件工程?.md.html">学习攻略 怎样学好软件工程?.md.html</a>
|
||
|
||
|
||
|
||
</li>
|
||
|
||
<li>
|
||
|
||
|
||
|
||
|
||
|
||
<a href="/专栏/软件工程之美/特别放送 从软件工程的角度解读任正非的新年公开信.md.html">特别放送 从软件工程的角度解读任正非的新年公开信.md.html</a>
|
||
|
||
|
||
|
||
</li>
|
||
|
||
<li>
|
||
|
||
|
||
|
||
|
||
|
||
<a href="/专栏/软件工程之美/结束语 万事皆项目,软件工程无处不在.md.html">结束语 万事皆项目,软件工程无处不在.md.html</a>
|
||
|
||
|
||
|
||
</li>
|
||
|
||
</ul>
|
||
|
||
|
||
|
||
</div>
|
||
|
||
</div>
|
||
|
||
|
||
|
||
<div class="sidebar-toggle" onclick="sidebar_toggle()" onmouseover="add_inner()" onmouseleave="remove_inner()">
|
||
|
||
<div class="sidebar-toggle-inner"></div>
|
||
|
||
</div>
|
||
|
||
|
||
|
||
<script>
|
||
|
||
function add_inner() {
|
||
|
||
let inner = document.querySelector('.sidebar-toggle-inner')
|
||
|
||
inner.classList.add('show')
|
||
|
||
}
|
||
|
||
|
||
|
||
function remove_inner() {
|
||
|
||
let inner = document.querySelector('.sidebar-toggle-inner')
|
||
|
||
inner.classList.remove('show')
|
||
|
||
}
|
||
|
||
|
||
|
||
function sidebar_toggle() {
|
||
|
||
let sidebar_toggle = document.querySelector('.sidebar-toggle')
|
||
|
||
let sidebar = document.querySelector('.book-sidebar')
|
||
|
||
let content = document.querySelector('.off-canvas-content')
|
||
|
||
if (sidebar_toggle.classList.contains('extend')) { // show
|
||
|
||
sidebar_toggle.classList.remove('extend')
|
||
|
||
sidebar.classList.remove('hide')
|
||
|
||
content.classList.remove('extend')
|
||
|
||
} else { // hide
|
||
|
||
sidebar_toggle.classList.add('extend')
|
||
|
||
sidebar.classList.add('hide')
|
||
|
||
content.classList.add('extend')
|
||
|
||
}
|
||
|
||
}
|
||
|
||
|
||
|
||
|
||
|
||
function open_sidebar() {
|
||
|
||
let sidebar = document.querySelector('.book-sidebar')
|
||
|
||
let overlay = document.querySelector('.off-canvas-overlay')
|
||
|
||
sidebar.classList.add('show')
|
||
|
||
overlay.classList.add('show')
|
||
|
||
}
|
||
|
||
function hide_canvas() {
|
||
|
||
let sidebar = document.querySelector('.book-sidebar')
|
||
|
||
let overlay = document.querySelector('.off-canvas-overlay')
|
||
|
||
sidebar.classList.remove('show')
|
||
|
||
overlay.classList.remove('show')
|
||
|
||
}
|
||
|
||
|
||
|
||
</script>
|
||
|
||
|
||
|
||
<div class="off-canvas-content">
|
||
|
||
<div class="columns">
|
||
|
||
<div class="column col-12 col-lg-12">
|
||
|
||
<div class="book-navbar">
|
||
|
||
<!-- For Responsive Layout -->
|
||
|
||
<header class="navbar">
|
||
|
||
<section class="navbar-section">
|
||
|
||
<a onclick="open_sidebar()">
|
||
|
||
<i class="icon icon-menu"></i>
|
||
|
||
</a>
|
||
|
||
</section>
|
||
|
||
</header>
|
||
|
||
</div>
|
||
|
||
<div class="book-content" style="max-width: 960px; margin: 0 auto;
|
||
|
||
overflow-x: auto;
|
||
|
||
overflow-y: hidden;">
|
||
|
||
<div class="book-post">
|
||
|
||
<p id="tip" align="center"></p>
|
||
|
||
<div><h1>25 有哪些方法可以提高开发效率?</h1>
|
||
|
||
<p>你好,我是宝玉,今天我想与你讨论一个每个开发人员和项目管理者都关心的话题:如何提高开发效率。</p>
|
||
|
||
<p>我其实也一直很关注这个话题,收集了很多方法让自己工作变得卓有成效。通过对这些方法的应用,我也可以算得上是一个高效的程序员:曾一个人在很短时间完成了飞信 Web 版客户端;在 DePaul 上学之余,帮学校完成了在线教学播放器系统的改造;三个月时间帮公司完成了主站从 jQuery 到 React 的迁移。</p>
|
||
|
||
<p>如果让我对学过的这些方法做个整理和总结,再进一步精选提炼,我觉得对我影响最大的是“积极主动”、“以终为始”和“要事第一”这几条看似简单的工作原则。</p>
|
||
|
||
<h2>积极主动,行动起来改变自己</h2>
|
||
|
||
<p>相信你也和我有过相同的经历。成为一个高效程序员,最大的阻力不是来自于不知道方法,而是自己的消极心态。遇到进度延迟、效率低下之类的问题,你就会下意识觉得:</p>
|
||
|
||
<ul>
|
||
|
||
<li>
|
||
|
||
<p>时间进度太紧了;</p>
|
||
|
||
</li>
|
||
|
||
<li>
|
||
|
||
<p>我已经尽力了;</p>
|
||
|
||
</li>
|
||
|
||
<li>
|
||
|
||
<p>最近加班太多了没精神;</p>
|
||
|
||
</li>
|
||
|
||
<li>
|
||
|
||
<p>产品经理太不靠谱了,需求没想清楚,害的我瞎忙活。</p>
|
||
|
||
</li>
|
||
|
||
</ul>
|
||
|
||
<p>是的,你也知道这些答案都很消极负面,可是怎么控制自己不这么想呢?首先你要知道,无论这些事情的本质责任在于环境还是个人,抱怨排斥的心态对于实际工作的改进是没有任何帮助的。</p>
|
||
|
||
<p>当然,很多人也知道抱怨没用,但具体怎样才能做到不抱怨,并且积极主动呢?史蒂芬・柯维写在他的《高效能人士的七个习惯》书中,对这个问题提到了两个行之有效的建议,我们可以结合着软件开发来分析一下。</p>
|
||
|
||
<h4>想想再回应</h4>
|
||
|
||
<p>我还记得第一次有人给我介绍单元测试很好用,能让你效率更高、代码质量更好时,我的第一反应是不可能,这样明明要多写很多代码,怎么可能会高效?</p>
|
||
|
||
<p>于是我有一段时间是很排斥的,直到后来参与一个已经有单元测试的项目,尤其是在重构代码的时候,我发现修改了大量代码后,程序还是很稳定,当时便觉得应了网友的那句话,“真香”!</p>
|
||
|
||
<p>每个人对于外界的刺激都会做出反应,本能的或者习惯性的,就像我前面举的例子,遇到事情会本能的觉得都是外部原因。如果一直这样,那就会进入恶性循环,变得更加消极麻木。</p>
|
||
|
||
<p>但如果在回应之前,给自己一点时间想想,站在积极的方面理性思考一下,就可以去控制你的本能反应。</p>
|
||
|
||
<p>所以很多次,就在我脱口而出“不可能”或者“不行”的时候,我提醒自己再想想。于是我会改口说:“我试试”、“我再想想”。这样很多次提醒自己以后,会一点点由“不可能”的本能变成“我想想”的习惯。</p>
|
||
|
||
<p>后来有人跟我说 CI(持续集成)很好,我思考过了之后进行了尝试,在 Github 上建了一个项目,把 CI 搭起来试了一下,觉得真的是很好。如果我还是秉持着以前的消极心态,不知道又要晚多久才能去尝试。</p>
|
||
|
||
<h4>减少关注圈,扩大影响圈</h4>
|
||
|
||
<p>我关注很多事情,比如编程语言、明星八卦、国家大事,这些都是“关注圈”。而这其中,要区分哪些事,是我可以影响和掌控的,这些事则是“影响圈”。</p>
|
||
|
||
<p><strong>不要总盯着自己无法改变的部分,你需要要多花时间精力在影响圈上。</strong></p>
|
||
|
||
<p>比如说,我不能改变 996,至少我可以利用这时间多学习一点,找机会换一个更好的环境;我不能要求每个人都写单元测试,但是我自己的代码写了单元测试,这样项目质量更好了我也更有价值;我不能决定跟什么样的人一起共事,但是我愿意跟他们分享我的经验,他们成长了我也受益。</p>
|
||
|
||
<p>工作一段时间后,你也可以尝试去扩大自己的影响圈。</p>
|
||
|
||
<p>比如说,很多程序员像我一样,有过不少因为产品经理需求没想清楚导致返工的经历,后来我就格外关注产品设计相关的知识,业余时间自己学习了不少,这就相当于扩大了我的影响圈。</p>
|
||
|
||
<p>所以后来产品经理给我一个需求,我不需要在开发完成后才抱怨他不靠谱,而是在给我需求的时候就去跟他讨论,是不是有可能没想清楚。</p>
|
||
|
||
<p>当你不仅仅局限于程序员的角色思维,扩大了影响圈之后,你就可以试着向产品经理提出很多有价值的建议,比如:</p>
|
||
|
||
<ul>
|
||
|
||
<li>
|
||
|
||
<p>这个布局在文字很长的情况下会有什么变化?</p>
|
||
|
||
</li>
|
||
|
||
<li>
|
||
|
||
<p>如果网络很慢,加载数据的时候应该显示什么?加载失败显示什么?</p>
|
||
|
||
</li>
|
||
|
||
<li>
|
||
|
||
<p>如果数据为空的时候这个列表应该显示什么?</p>
|
||
|
||
</li>
|
||
|
||
</ul>
|
||
|
||
<p>其实“减少关注圈,扩大影响圈”这个道理也很简单:<strong>接受不能改变的,改变能改变的,尽量扩大可改变项的范围。</strong></p>
|
||
|
||
<h2>以终为始,想清楚再开工</h2>
|
||
|
||
<p>如果对比一下我在十几年前作为一个新手程序员,和现在作为一个老手写代码有什么不同的话,我认为在新手阶段,我是拿到需求就开始写,写到一半发现好像不对,马上修改,好像还不太对,就这样反反复复,效率很低下。</p>
|
||
|
||
<p>而现在拿到一个需求,我会先仔细的分析需求文档,反复和产品经理确认各种细节,然后做个简单的设计,考虑清楚模块怎么设计,他们之间是什么关系,然后再写,写完还要加上测试代码。</p>
|
||
|
||
<p>你知道最大的区别是什么吗?我现在做一件事之前,会先想清楚“终”,然后才知道怎么“始”。所以我先搞清楚需求这个“终”,然后再设计规划出这个从“始”通向“终”的路线,最后从“始”出发写代码,一气呵成,不仅快,而且质量好。这就是“以终为始”。</p>
|
||
|
||
<p>要做到“以终为始”,就是在做事情的时候注意三点:<strong>目标、原则和计划。</strong></p>
|
||
|
||
<h4>经常停下来想想目标</h4>
|
||
|
||
<p>我刚毕业参加工作的时候,要开发一个内容管理系统,其中涉及有数据库访问,这就需要把数据表的字段和类对应起来,觉得太体力活了,于是我开始写数据库生成代码工具。而要想写代码生成工具,我还得学习 Winform 知识……就这样几个月过去了,关于这个系统的代码还是最开始的几行!</p>
|
||
|
||
<p>我的目标是写一个内容管理系统,结果却跑去写代码生成工具,这样怎么能做到高效呢?正确的做法应该是手动完成这几个类的生成,其实用不了几分钟,或者用一个现成的工具。如果觉得代码生成工具是个有意义的项目,应该另外立项,而不应该影响当前的项目。</p>
|
||
|
||
<p>这样的事情在我身上还发生过几次,所以我后来就逼着自己隔一段时间要停下来想想:我的原始目标是什么?我正在做的事是我的目标吗?如果不是,那么马上回到自己的原始目标去。</p>
|
||
|
||
<h4>制定原则</h4>
|
||
|
||
<p>其实大部分很好的编程方法都是需要坚持做才有效果的,比如说自动化测试代码,有时候时间进度一紧,就会来不及写,时间一长,就会欠下技术债务。</p>
|
||
|
||
<p>所以我给自己定了一个原则:增加一个功能,就要写自动化测试,如果来不及写,就给自己写一条 Ticket。</p>
|
||
|
||
<p>这条原则我坚持得很好,所以我的自动化测试代码得以坚持,从而真正帮助我做到高效开发。</p>
|
||
|
||
<p>你也可以给自己定一些原则,比如:</p>
|
||
|
||
<ul>
|
||
|
||
<li>
|
||
|
||
<p>“先运行再优化 (Make it Work Make It Right Make It Fast)”——也就是在优化代码之前,先用简单的方法实现,再考虑怎么优化,这样可以保证设计的简单,也可以避免你陷入技术细节中而忽视了原始目标。</p>
|
||
|
||
</li>
|
||
|
||
<li>
|
||
|
||
<p>“不复制粘贴代码 (Don’t repeat yourself)”——复制粘贴会导致代码臃肿,不便于维护,提取抽象可以保持简洁。</p>
|
||
|
||
</li>
|
||
|
||
<li>
|
||
|
||
<p>“每个 Pull Request 要尽可能小”——这有助于把复杂的任务分解成几个简单的任务,简单的任务更容易高效完成。</p>
|
||
|
||
</li>
|
||
|
||
</ul>
|
||
|
||
<p>有原则了,你才能不忘初心,有始有终。</p>
|
||
|
||
<h4>公开自己的计划</h4>
|
||
|
||
<p>那么有了原则就够了吗?显然不是,有了原则,你还要坚定不移地去执行。如何执行呢?做计划。</p>
|
||
|
||
<p>刚开始工作时,我是害怕做计划的,怕计划了完不成,问到我工作的时间安排时,我会给一个模凌两可的答复,这其实导致了我在实际开发时,缺少进度压力,从而迷失在细节中导致延误进度。</p>
|
||
|
||
<p>后来我尝试做出了一些改变,把任务细化,做个简单计划,主动给出一个明确的时间点。有了计划指引和时间点的压力,会倒逼着自己时刻专注于目标是什么,“终”在哪里,还有多少没有完成,这样下来工作效率自然而然就会高起来。</p>
|
||
|
||
<p>通过在做事时,围绕着目标、原则和计划这三个点,反复地刻意地练习,也可以让你慢慢养成“以终为始”的好习惯。</p>
|
||
|
||
<h2>要事第一,把时间用在刀刃上</h2>
|
||
|
||
<p>作为程序员,其实大部分时间并不能专注写程序,总有各种各样的事情打断我们,比如,一会产品经理找你过去开个会确认个需求;一会测试过来找你重现一个 Bug;一会还有同事过来请教你一个问题;微信上老朋友找你叙叙旧;突然生产环境出故障了,需要马上去解决。</p>
|
||
|
||
<p>就这样一天下去,感觉一直在忙忙碌碌,其实并没有多少时间在写程序。这时候怎么办呢,对手头的事情进行优先级管理。</p>
|
||
|
||
<p>时间四象限也许你不陌生,就是把事情分成重要紧急、重要不紧急、紧急不重要、不紧急不重要四个象限,不同的事情有不同的应对策略。</p>
|
||
|
||
<ul>
|
||
|
||
<li><strong>重要紧急的事情马上处理</strong></li>
|
||
|
||
</ul>
|
||
|
||
<p>比如说,生产环境出故障了,测试环境部署失败了,这些都是重要并且紧急的事情,只能是马上处理。</p>
|
||
|
||
<ul>
|
||
|
||
<li><strong>重要不紧急的要事,要花最多的时间在上面</strong></li>
|
||
|
||
</ul>
|
||
|
||
<p>对代码重构、写自动化测试代码、确认清楚需求文档,这些事情都属于重要不紧急的事情,但是如果不及时处理,就有可能变成重要紧急的事情,比如不偿还技术债务,就可能会变成生产环境故障。</p>
|
||
|
||
<p>所以这部分事情我会多花时间,重点做。通常我会每段时间只专注做一两件重要的事,其他事情尽可能忽略,比如前一个阶段我主要的工作就是重构前端代码,这个阶段我就在忙排查性能隐患,至于其他事情,就先放一放。</p>
|
||
|
||
<ul>
|
||
|
||
<li><strong>紧急不重要的事凑一起集中做</strong></li>
|
||
|
||
</ul>
|
||
|
||
<p>像微信的消息通知,无关紧要的会议,请教一个不算很急的技术问题,这些都是紧急不重要的问题,然而却会占用我们大量时间。如果时间都用在这些事情上面,必然会占用在重要事情上所需的时间。</p>
|
||
|
||
<p>所以我有些小技巧也许你可以参考。比如我在专注干活时,会全屏幕、关掉所有消息通知,保证没有消息干扰,忙完一段后再去集中处理。</p>
|
||
|
||
<p>还有如果有人找我时我正在忙,如果他的事情不是重要紧急的,我会礼貌地告诉他我正好手头有点事情,大约多少时间后我主动去找他。相应的我也会尊重别人的时间,找别人的时候会先问一下:“你什么时候有 10 分钟左右时间,我想请教你一个问题?”</p>
|
||
|
||
<ul>
|
||
|
||
<li><strong>不重要不紧急的事情能不做就不做</strong></li>
|
||
|
||
</ul>
|
||
|
||
<p>不紧急不重要的事也很多,比如说我的 Mac 电脑突然提示我要更新系统了。我有点强迫症,以前系统一有要升级,我就迫不及待要升级到最新,结果一升级系统,半天就不能干活了。所以后来这种事情,就放在不重要的时间去做,比如周末、睡觉之前让它慢慢升级。</p>
|
||
|
||
<p>其实我在做开发的时候,觉得很多很杂的事情也不算太多,真正到后来转型做管理的时候,才真正体会到什么叫事情多而杂。但正是源于开发时期就形成的时间四象限方法的运用,让我可以在繁忙的时候,保证时间用在有价值的事情上。</p>
|
||
|
||
<p>要事第一,就是要保证你有限的时间用在最有价值的事情上。</p>
|
||
|
||
<h2>总结</h2>
|
||
|
||
<p>积极主动、 以终为始和要事第一,这三个原则以及其衍生出来的方法,正是帮助我逐步变成一个高效程序员的关键所在,希望也能对你有所帮助。</p>
|
||
|
||
<p>如果你已经学习了很多类似的原则或者方法,而觉得没什么效果,那也许只是因为没有尝试把它们变成习惯。你可以像我一样,把认同的好的原则或方法,通过反复的刻意练习,反复地提醒自己,训练成习惯,然后用习惯指导你的日常开发。</p>
|
||
|
||
<p>当然,这样的改变不会是一天两天就能完成,但也不用着急,因为习惯的养成需要时间的积累,才能变成条件反射。当你把好的原则或方法变成了直觉反应,自然就会成为一个高效的程序员。</p>
|
||
|
||
</div>
|
||
|
||
</div>
|
||
|
||
<div>
|
||
|
||
<div style="float: left">
|
||
|
||
<a href="/专栏/软件工程之美/24 技术债务:是继续修修补补凑合着用,还是推翻重来?.md.html">上一页</a>
|
||
|
||
</div>
|
||
|
||
<div style="float: right">
|
||
|
||
<a href="/专栏/软件工程之美/26 持续交付:如何做到随时发布新版本到生产环境?.md.html">下一页</a>
|
||
|
||
</div>
|
||
|
||
</div>
|
||
|
||
|
||
|
||
</div>
|
||
|
||
</div>
|
||
|
||
</div>
|
||
|
||
</div>
|
||
|
||
|
||
|
||
<a class="off-canvas-overlay" onclick="hide_canvas()"></a>
|
||
|
||
</div>
|
||
|
||
<script defer src="https://static.cloudflareinsights.com/beacon.min.js/v652eace1692a40cfa3763df669d7439c1639079717194" integrity="sha512-Gi7xpJR8tSkrpF7aordPZQlW2DLtzUlZcumS8dMQjwDHEnw9I7ZLyiOj/6tZStRBGtGgN6ceN6cMH8z7etPGlw==" data-cf-beacon='{"rayId":"70997c71dc013cfa","version":"2021.12.0","r":1,"token":"1f5d475227ce4f0089a7cff1ab17c0f5","si":100}' crossorigin="anonymous"></script>
|
||
|
||
</body>
|
||
|
||
<!-- Global site tag (gtag.js) - Google Analytics -->
|
||
|
||
<script async src="https://www.googletagmanager.com/gtag/js?id=G-NPSEEVD756"></script>
|
||
|
||
<script>
|
||
|
||
window.dataLayer = window.dataLayer || [];
|
||
|
||
|
||
|
||
function gtag() {
|
||
|
||
dataLayer.push(arguments);
|
||
|
||
}
|
||
|
||
|
||
|
||
gtag('js', new Date());
|
||
|
||
gtag('config', 'G-NPSEEVD756');
|
||
|
||
var path = window.location.pathname
|
||
|
||
var cookie = getCookie("lastPath");
|
||
|
||
console.log(path)
|
||
|
||
if (path.replace("/", "") === "") {
|
||
|
||
if (cookie.replace("/", "") !== "") {
|
||
|
||
console.log(cookie)
|
||
|
||
document.getElementById("tip").innerHTML = "<a href='" + cookie + "'>跳转到上次进度</a>"
|
||
|
||
}
|
||
|
||
} else {
|
||
|
||
setCookie("lastPath", path)
|
||
|
||
}
|
||
|
||
|
||
|
||
function setCookie(cname, cvalue) {
|
||
|
||
var d = new Date();
|
||
|
||
d.setTime(d.getTime() + (180 * 24 * 60 * 60 * 1000));
|
||
|
||
var expires = "expires=" + d.toGMTString();
|
||
|
||
document.cookie = cname + "=" + cvalue + "; " + expires + ";path = /";
|
||
|
||
}
|
||
|
||
|
||
|
||
function getCookie(cname) {
|
||
|
||
var name = cname + "=";
|
||
|
||
var ca = document.cookie.split(';');
|
||
|
||
for (var i = 0; i < ca.length; i++) {
|
||
|
||
var c = ca[i].trim();
|
||
|
||
if (c.indexOf(name) === 0) return c.substring(name.length, c.length);
|
||
|
||
}
|
||
|
||
return "";
|
||
|
||
}
|
||
|
||
|
||
|
||
</script>
|
||
|
||
|
||
|
||
</html>
|
||
|