learn.lianglianglee.com/专栏/软件工程之美/41 为什么程序员的业余项目大多都死了?.md.html
2022-08-14 03:40:33 +08:00

383 lines
31 KiB
HTML
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<!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>41 为什么程序员的业余项目大多都死了?.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 开篇词 你为什么应该学好软件工程?</a>
</li>
<li>
<a href="/专栏/软件工程之美/01 到底应该怎样理解软件工程?.md.html">01 到底应该怎样理解软件工程?</a>
</li>
<li>
<a href="/专栏/软件工程之美/02 工程思维:把每件事都当作一个项目来推进.md.html">02 工程思维:把每件事都当作一个项目来推进</a>
</li>
<li>
<a href="/专栏/软件工程之美/03 瀑布模型:像工厂流水线一样把软件开发分层化.md.html">03 瀑布模型:像工厂流水线一样把软件开发分层化</a>
</li>
<li>
<a href="/专栏/软件工程之美/04 瀑布模型之外,还有哪些开发模型?.md.html">04 瀑布模型之外,还有哪些开发模型?</a>
</li>
<li>
<a href="/专栏/软件工程之美/05 敏捷开发到底是想解决什么问题?.md.html">05 敏捷开发到底是想解决什么问题?</a>
</li>
<li>
<a href="/专栏/软件工程之美/06 大厂都在用哪些敏捷方法?(上).md.html">06 大厂都在用哪些敏捷方法?(上)</a>
</li>
<li>
<a href="/专栏/软件工程之美/07 大厂都在用哪些敏捷方法?(下).md.html">07 大厂都在用哪些敏捷方法?(下)</a>
</li>
<li>
<a href="/专栏/软件工程之美/08 怎样平衡软件质量与时间成本范围的关系?.md.html">08 怎样平衡软件质量与时间成本范围的关系?</a>
</li>
<li>
<a href="/专栏/软件工程之美/09 为什么软件工程项目普遍不重视可行性分析?.md.html">09 为什么软件工程项目普遍不重视可行性分析?</a>
</li>
<li>
<a href="/专栏/软件工程之美/10 如果你想技术转管理,先来试试管好一个项目.md.html">10 如果你想技术转管理,先来试试管好一个项目</a>
</li>
<li>
<a href="/专栏/软件工程之美/11 项目计划:代码未动,计划先行.md.html">11 项目计划:代码未动,计划先行</a>
</li>
<li>
<a href="/专栏/软件工程之美/12 流程和规范:红绿灯不是约束,而是用来提高效率.md.html">12 流程和规范:红绿灯不是约束,而是用来提高效率</a>
</li>
<li>
<a href="/专栏/软件工程之美/13 白天开会,加班写代码的节奏怎么破?.md.html">13 白天开会,加班写代码的节奏怎么破?</a>
</li>
<li>
<a href="/专栏/软件工程之美/14 项目管理工具:一切管理问题,都应思考能否通过工具解决.md.html">14 项目管理工具:一切管理问题,都应思考能否通过工具解决</a>
</li>
<li>
<a href="/专栏/软件工程之美/15 风险管理不能盲目乐观凡事都应该有B计划.md.html">15 风险管理不能盲目乐观凡事都应该有B计划</a>
</li>
<li>
<a href="/专栏/软件工程之美/16 怎样才能写好项目文档?.md.html">16 怎样才能写好项目文档?</a>
</li>
<li>
<a href="/专栏/软件工程之美/17 需求分析到底要分析什么?怎么分析?.md.html">17 需求分析到底要分析什么?怎么分析?</a>
</li>
<li>
<a href="/专栏/软件工程之美/18 原型设计:如何用最小的代价完成产品特性?.md.html">18 原型设计:如何用最小的代价完成产品特性?</a>
</li>
<li>
<a href="/专栏/软件工程之美/19 作为程序员,你应该有产品意识.md.html">19 作为程序员,你应该有产品意识</a>
</li>
<li>
<a href="/专栏/软件工程之美/20 如何应对让人头疼的需求变更问题?.md.html">20 如何应对让人头疼的需求变更问题?</a>
</li>
<li>
<a href="/专栏/软件工程之美/21 架构设计:普通程序员也能实现复杂系统?.md.html">21 架构设计:普通程序员也能实现复杂系统?</a>
</li>
<li>
<a href="/专栏/软件工程之美/22 如何为项目做好技术选型?.md.html">22 如何为项目做好技术选型?</a>
</li>
<li>
<a href="/专栏/软件工程之美/23 架构师:不想当架构师的程序员不是好程序员.md.html">23 架构师:不想当架构师的程序员不是好程序员</a>
</li>
<li>
<a href="/专栏/软件工程之美/24 技术债务:是继续修修补补凑合着用,还是推翻重来?.md.html">24 技术债务:是继续修修补补凑合着用,还是推翻重来?</a>
</li>
<li>
<a href="/专栏/软件工程之美/25 有哪些方法可以提高开发效率?.md.html">25 有哪些方法可以提高开发效率?</a>
</li>
<li>
<a href="/专栏/软件工程之美/26 持续交付:如何做到随时发布新版本到生产环境?.md.html">26 持续交付:如何做到随时发布新版本到生产环境?</a>
</li>
<li>
<a href="/专栏/软件工程之美/27 软件工程师的核心竞争力是什么?(上).md.html">27 软件工程师的核心竞争力是什么?(上)</a>
</li>
<li>
<a href="/专栏/软件工程之美/28 软件工程师的核心竞争力是什么?(下).md.html">28 软件工程师的核心竞争力是什么?(下)</a>
</li>
<li>
<a href="/专栏/软件工程之美/29 自动化测试如何把Bug杀死在摇篮里.md.html">29 自动化测试如何把Bug杀死在摇篮里</a>
</li>
<li>
<a href="/专栏/软件工程之美/30 用好源代码管理工具,让你的协作更高效.md.html">30 用好源代码管理工具,让你的协作更高效</a>
</li>
<li>
<a href="/专栏/软件工程之美/31 软件测试要为产品质量负责吗?.md.html">31 软件测试要为产品质量负责吗?</a>
</li>
<li>
<a href="/专栏/软件工程之美/32 软件测试:什么样的公司需要专职测试?.md.html">32 软件测试:什么样的公司需要专职测试?</a>
</li>
<li>
<a href="/专栏/软件工程之美/33 测试工具为什么不应该通过QQ微信邮件报Bug.md.html">33 测试工具为什么不应该通过QQ微信邮件报Bug</a>
</li>
<li>
<a href="/专栏/软件工程之美/34 账号密码泄露成灾,应该怎样预防?.md.html">34 账号密码泄露成灾,应该怎样预防?</a>
</li>
<li>
<a href="/专栏/软件工程之美/35 版本发布:软件上线只是新的开始.md.html">35 版本发布:软件上线只是新的开始</a>
</li>
<li>
<a href="/专栏/软件工程之美/36 DevOps工程师到底要做什么事情.md.html">36 DevOps工程师到底要做什么事情</a>
</li>
<li>
<a href="/专栏/软件工程之美/37 遇到线上故障,你和高手的差距在哪里?.md.html">37 遇到线上故障,你和高手的差距在哪里?</a>
</li>
<li>
<a href="/专栏/软件工程之美/38 日志管理:如何借助工具快速发现和定位产品问题 .md.html">38 日志管理:如何借助工具快速发现和定位产品问题 </a>
</li>
<li>
<a href="/专栏/软件工程之美/39 项目总结:做好项目复盘,把经验变成能力.md.html">39 项目总结:做好项目复盘,把经验变成能力</a>
</li>
<li>
<a href="/专栏/软件工程之美/40 最佳实践:小团队如何应用软件工程?.md.html">40 最佳实践:小团队如何应用软件工程?</a>
</li>
<li>
<a class="current-tab" href="/专栏/软件工程之美/41 为什么程序员的业余项目大多都死了?.md.html">41 为什么程序员的业余项目大多都死了?</a>
</li>
<li>
<a href="/专栏/软件工程之美/42 反面案例:盘点那些失败的软件项目.md.html">42 反面案例:盘点那些失败的软件项目</a>
</li>
<li>
<a href="/专栏/软件工程之美/43 以VS Code为例看大型开源项目是如何应用软件工程的.md.html">43 以VS Code为例看大型开源项目是如何应用软件工程的</a>
</li>
<li>
<a href="/专栏/软件工程之美/44 微软、谷歌、阿里巴巴等大厂是怎样应用软件工程的?.md.html">44 微软、谷歌、阿里巴巴等大厂是怎样应用软件工程的?</a>
</li>
<li>
<a href="/专栏/软件工程之美/45 从软件工程的角度看微服务、云计算、人工智能这些新技术.md.html">45 从软件工程的角度看微服务、云计算、人工智能这些新技术</a>
</li>
<li>
<a href="/专栏/软件工程之美/一问一答第1期 30个软件开发常见问题解决策略.md.html">一问一答第1期 30个软件开发常见问题解决策略</a>
</li>
<li>
<a href="/专栏/软件工程之美/一问一答第2期 30个软件开发常见问题解决策略.md.html">一问一答第2期 30个软件开发常见问题解决策略</a>
</li>
<li>
<a href="/专栏/软件工程之美/一问一答第3期 18个软件开发常见问题解决策略.md.html">一问一答第3期 18个软件开发常见问题解决策略</a>
</li>
<li>
<a href="/专栏/软件工程之美/一问一答第4期 14个软件开发常见问题解决策略.md.html">一问一答第4期 14个软件开发常见问题解决策略</a>
</li>
<li>
<a href="/专栏/软件工程之美/一问一答第5期 22个软件开发常见问题解决策略.md.html">一问一答第5期 22个软件开发常见问题解决策略</a>
</li>
<li>
<a href="/专栏/软件工程之美/学习攻略 怎样学好软件工程?.md.html">学习攻略 怎样学好软件工程?</a>
</li>
<li>
<a href="/专栏/软件工程之美/特别放送 从软件工程的角度解读任正非的新年公开信.md.html">特别放送 从软件工程的角度解读任正非的新年公开信</a>
</li>
<li>
<a href="/专栏/软件工程之美/结束语 万事皆项目,软件工程无处不在.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>41 为什么程序员的业余项目大多都死了?</h1>
<p>你好,我是宝玉。对于不会写程序的人来说,想做一个软件项目,就得找程序员帮忙写程序。而对于程序员来说,想做一个软件项目,写程序不是问题,产品设计自己也能做一点。所以对于很多程序员来说,一旦有了一个想法,可能就会利用工作之外的时间,做点自己的业余项目(也叫 Side Project</p>
<p>然而大部分项目,都是怀着美好的期望开始,结果做到一半就无疾而终,就算少数坚持到了上线发布,最终还是因为少人问津而不得不放弃。</p>
<p>所以今天将带你一起分析一下,为什么程序员的业余项目大多都死了?怎么样可以借助学习到的软件工程知识提升业余项目成功的概率?</p>
<h2>为什么程序员的业余项目大多都死了?</h2>
<p>作为程序员,我也很热衷于做业余项目,周围的程序员朋友们也有不少做业余项目的案例,通过对这些案例的观察和分析,我觉得程序员做的业余项目,主要死于以下这些情况。</p>
<h4>1. 想法大,时间少</h4>
<p>我有个朋友,前一段突然有了一个想法,想做一个类似于 Excel 的基于网页的在线电子表格程序,这是个很大的想法,毕竟微软和谷歌都是有一个团队在完成这样的项目。</p>
<p>但他觉得如果只是实现最核心功能还是可行的,于是激情满满地找资料,写原型代码。然而现实还是很残酷的,他上班就忙,经常加班,下班还要带娃,留给自己的时间其实不算多,一段时间看不到成果后,慢慢的激情就消逝了,这个项目也就不了了之了,而现在他已经又在尝试其他项目了。</p>
<p>这是一个常见的现象,很多程序员在业余做项目开始之前激情满满,经过一段时间没有进展,没有正向反馈,很容易就激情消逝,不想再继续了。尤其是一段时间后,可能又有新的项目想法了,于是就又开始了一个新的循环。</p>
<h4>2. 过于追求技术,缺少约束</h4>
<p>在公司的项目中,我还是比较保守的,毕竟要受限于项目的成本、时间和范围的限制,而且有 Dead Line 的强约束,所以不会太激进,能稳定上线运行是第一位的。而我一旦去做业余项目,就会陷入过于追求技术的困境。</p>
<p>我前年的时候,想对自己的一个网站进行升级,如果用传统的熟悉的技术方案应该不需要太长时间,但我想体验当时比较新的 React Universal 技术,后端 API 要使用当时时髦的 GraphQL要考虑多数据库的支持还要用上 WebSocket 保持内容及时更新。结果有些知识还需要边学边用,虽然在学习这些知识的时候收获不小,但是项目进度却是惨不忍睹,到今天还只有一点雏形。</p>
<p>程序员的业余项目,因为缺少成本、时间和范围的限制,没有设置 Dead Line 约束,所以经常会天马行空,只为了追求技术上的兴奋点,恨不得把新酷技术都用上。</p>
<p>但如果看看项目的定义:</p>
<blockquote>
<p>项目是指一系列独特的、复杂的并相互关联的活动,这些活动有着一个明确的目标或目的,必须在特定的时间、预算、资源限定内,依据规范完成。(摘自百度百科)</p>
</blockquote>
<p>你就可以发现,项目是要有目标要有约束的。一个缺少目标和约束的项目,是难以成功的。</p>
<h4>3. 缺少产品能力和运营能力</h4>
<p>有一些程序员,是有做产品的梦想的,希望能打造一款好的产品,解决工作生活中的一些问题,或者就是想通过做产品去赚点钱。其实这样的不乏成功案例,比如像业余时间打造出知名的 iOS 应用 Pin 和 JSBox 的<a href="https://sspai.com/post/46390">钟颖</a>,还有像<a href="https://sspai.com/post/30876">图拉鼎</a>这样的人,他们先是程序员,后来因为有了成功的产品而做独立开发者的例子。</p>
<p>但这样的例子并不多,普遍存在的情况是,当程序员们真正要去打造产品的时候,却发现要做一个产品并不是那么容易的事情,缺少产品能力就无法设计出好的产品,缺少运营能力就算产品做出来也鲜有人问津。而那些真正成功的独立开发者,无不是能兼顾产品设计能力和产品运营能力,既能设计出真正解决用户需求的产品,又能通过一定的运营让用户了解产品,为之买单付钱的人。</p>
<h2>怎样提升业余项目成功的概率?</h2>
<p>想法大,时间少;过于追求技术,缺少约束;缺少产品能力和运营能力。这几点是程序员业余项目失败的主要原因。如果要应用软件工程知识来寻找这些问题的解决方案,你会想到什么方案呢?</p>
<h4>1. 怎么样让项目不至于半途而废?</h4>
<p>想法大,时间少怎么办?怎么样让项目不至于半途而废呢?</p>
<p>回想一下专栏文章《08 怎样平衡软件质量与时间成本范围的关系?》中的金三角理论,在这一篇中,我解释了如何去平衡软件质量与时间成本范围的关系,今后你会发现项目中很多问题都能应用到金三角的理论。</p>
<p>比如说,想法大,其实就是范围大,按照金三角的理论,你要去固定一条边或者两条边,然后去调整剩下的边。</p>
<p>对于业余项目来讲,其实时间是很难去控制的,也就是你不可能像每天上班那样投入大量的时间在上面,所以这条边要被固定起来。</p>
<p>然后看成本这条边,虽然理论上来说你可以花钱请人帮你,也可以花钱买成熟的商业组件,但作为一个业余项目,一般来说前期不会投入大成本的。你也可以假定它是固定的。</p>
<p>那么最适合调整的边就是范围这条边,毕竟作为一个业余项目,你可以先实现最核心的功能。可以采用 MVPminimum viable product最小化的可行性产品的模式一开始只推出最核心的功能满足用户最核心的需求然后在用户的使用过程中收集反馈进一步升级迭代。</p>
<p>前不久一个朋友做了一款播客的应用,他就是采用的 MVP 的开发模式,先快速发布了一个只有核心功能的版本,甚至还很多 Bug。发布后邀请了几个朋友试用收集了反馈并且也把发现的 Bug 修复了,再逐步增加新功能。这样几个迭代后,他的 App 已经登上了新闻分类的排行榜。如果一开始他就想的是要做一个很大的项目,也许到现在还在开发中呢。</p>
<p>即使程序员做的是业余项目,还有必要补充的一点就是:**在决定做什么项目之前,一样要充分考虑项目的可行性研究。**关于这一点你可以参考专栏文章《09 可行性研究: 一个从一开始就注定失败的跨平台项目》去从经济可行性、技术可行性还有社会可行性方面,去分析一下项目是不是真的可行,再动手不迟。</p>
<h4>2. 怎么避免陷入过于追求技术,项目难以交付的困境?</h4>
<p>过于追求技术,缺少约束是程序员业余项目失败的另一个主要原因。</p>
<p>程序员追求技术是天性,这一点其实也不是坏事,重点是要有所约束,毫无约束的结果就是迷失在技术中,而忘记了项目的整体。</p>
<p>这其实也是我在专栏一开始就写的《02 工程思维:把每件事都当作一个项目来推进》中提到的,要把业余项目也当作一个正式的项目,做你的业余项目时,也要站在项目的整体去思考项目的进展,而不是沉迷于局部的技术实现。</p>
<p>所以你有业余项目的话也要像专栏文章《11 项目计划:代码未动,计划先行》中提到的那样,去做项目计划,去设置里程碑。还要敢于把计划和里程碑分享给你的家人和朋友们,公开的做出里程碑的承诺,让他们帮助监督你的计划执行。</p>
<p>当你有了一个可行的计划,有了真正的 Dead Line你的项目交付就有了基本的保障。</p>
<p>我前些年运营过网站,一个针对我的母校西北工业大学校友们的论坛网站叫开放实验室,我需要负责这个网站的日常运营和程序开发,所以每次升级之前,我都会在论坛发帖子公布我的升级计划,设定一个上线时间,这样网站的用户会监督我的项目进度。有了进度的压力,就会逼着我必须按时完成,而不是老想着用什么新酷的技术。</p>
<p>在你的业余项目难以交付的时候,记住一句话:<strong>Dead Line 就是第一生产力。</strong></p>
<h4>3. 怎么弥补你的短板?</h4>
<p>产品能力和运营能力是大部分程序员的短板。</p>
<p>关于产品设计我们专栏需求分析篇的几篇文章可以参考。《17 需求分析到底要分析什么?怎么分析?》可以帮助你去分析用户真正的需求是什么,从而让你可以做出来用户想要的,而不是自己凭空想象出来的用户需求。</p>
<p>产品能力的锻炼不是一朝一夕就能炼成的但日常多模仿多实践还是能做出来不错的产品设计我在专栏文章《19 作为程序员,你应该有产品意识》中如何培养产品能力上,给出了一些具体的建议。</p>
<p>比如说你可以从解决自己的需求,解决家人朋友的需求开始,设定一个小的产品目标,然后借鉴类似的产品,模仿它们的产品设计、交互设计,就能做出来一个基本可用的产品。</p>
<p>像 UI 设计,其实现在无论是网站的 UI 设计还是 App 的 UI 设计,都趋向于标准化,对于一个业余项目,使用一些标准模板,或者花点钱购买一套漂亮的界面模板,都是不错的选择。</p>
<p>对于产品的运营,这一点很遗憾,软件工程重点是讲如何做项目的,并没有太多运营相关的知识。我个人的一点经验就是,如果你要运营一款产品,你需要想清楚以下几个问题:</p>
<p>想清楚你的产品能给用户带来什么样的价值?帮助用户解决什么问题?</p>
<p>商业模式是什么?也就是用户是不是会为你的产品付钱?或者你的产品通过什么方式赚钱?</p>
<p>如何让用户知道你的产品?如何让用户知道你产品所能带来的价值?</p>
<p>只有想清楚了你的产品的核心价值是什么,才好去针对性的运营你的产品。具体产品的运营上,可以找你的朋友作为第一批用户,然后去像<a href="https://www.producthunt.com/">Product Hunt</a>这样的网站发帖子自荐还可以通过微博、Twitter 这样的社交媒体宣传。</p>
<p>除了自己去学习产品知识和运营知识之外,其实还有一种方式,就是组建一个小团队,找到志同道合的人一起,你写程序,有人做产品设计,有人负责运营推广,大家取长补短,一起把产品做好!</p>
<h2>总结</h2>
<p>今天带你一起分析了程序员的业余项目失败的原因。想法大,时间少;过于追求技术,缺少约束;缺少产品能力和运营能力。这几点是程序员业余项目失败的主要原因。</p>
<p>针对想法大、时间少的问题,可以借助软件项目金三角的理论,去缩小范围,在做项目时,可以采用 MVP 的开发模式,先实现核心需求,再逐步增加功能。</p>
<p>针对过于追求技术、缺少约束的问题,应该要对你的项目制定计划,设定里程碑,把时间点告诉你的家人和朋友,让他们监督你执行,通过 Dead Line 来保障项目的进度。</p>
<p>针对缺少产品能力和运营能力的问题,需要有针对性地去学习相关知识,也可以去组建小团队,弥补这些方面能力的不足。</p>
<p>最后,即使程序员们的业余项目很可能会是以失败告终,我做过很多失败的业余项目,但我还是强烈的建议你多尝试做一做业余项目。因为做业余项目,即使项目失败了,一样可以让你收获很多:</p>
<ul>
<li>
<p>通过业余项目,你可以学习和使用工作中不会使用的技术。你工作中做后端开发,你业余项目完全可以体验 iOS App 开发。</p>
</li>
<li>
<p>通过业余项目,你有机会去按照自己的想法去实现。很多时候在工作中,因为你无法去做决策,无法改变架构的设计或产品的设计,而在自己的业余项目中,你可以完全按照自己的想法去尝试,去证明自己。</p>
</li>
<li>
<p>通过业余项目,可以锻炼你的大局观和工程思维。当你真的去自己负责一个项目时,就会更多地去站在项目的整体去思考一个项目,而不是局限于专业领域。</p>
</li>
<li>
<p>通过业余项目,帮助你更好地在项目中沟通。在做过业余项目后,在工作中,和产品经理、测试沟通,你会更懂他们,因为他们的工作你也体验过了,你会体会到他们的工作其实不像你最初想的那么容易。</p>
</li>
</ul>
</div>
</div>
<div>
<div style="float: left">
<a href="/专栏/软件工程之美/40 最佳实践:小团队如何应用软件工程?.md.html">上一页</a>
</div>
<div style="float: right">
<a href="/专栏/软件工程之美/42 反面案例:盘点那些失败的软件项目.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":"70997c987fd53cfa","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>