-
Notifications
You must be signed in to change notification settings - Fork 41
/
Copy pathindex.html
1249 lines (1245 loc) · 110 KB
/
index.html
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta name="generator" content="pandoc">
<meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=yes">
<title>增长工程师修炼之道 – </title>
<style type="text/css">code{white-space: pre;}</style>
<style type="text/css">
div.sourceCode { overflow-x: auto; }
table.sourceCode, tr.sourceCode, td.lineNumbers, td.sourceCode {
margin: 0; padding: 0; vertical-align: baseline; border: none; }
table.sourceCode { width: 100%; line-height: 100%; }
td.lineNumbers { text-align: right; padding-right: 4px; padding-left: 4px; color: #aaaaaa; border-right: 1px solid #aaaaaa; }
td.sourceCode { padding-left: 5px; }
code > span.kw { color: #007020; font-weight: bold; } /* Keyword */
code > span.dt { color: #902000; } /* DataType */
code > span.dv { color: #40a070; } /* DecVal */
code > span.bn { color: #40a070; } /* BaseN */
code > span.fl { color: #40a070; } /* Float */
code > span.ch { color: #4070a0; } /* Char */
code > span.st { color: #4070a0; } /* String */
code > span.co { color: #60a0b0; font-style: italic; } /* Comment */
code > span.ot { color: #007020; } /* Other */
code > span.al { color: #ff0000; font-weight: bold; } /* Alert */
code > span.fu { color: #06287e; } /* Function */
code > span.er { color: #ff0000; font-weight: bold; } /* Error */
code > span.wa { color: #60a0b0; font-weight: bold; font-style: italic; } /* Warning */
code > span.cn { color: #880000; } /* Constant */
code > span.sc { color: #4070a0; } /* SpecialChar */
code > span.vs { color: #4070a0; } /* VerbatimString */
code > span.ss { color: #bb6688; } /* SpecialString */
code > span.im { } /* Import */
code > span.va { color: #19177c; } /* Variable */
code > span.cf { color: #007020; font-weight: bold; } /* ControlFlow */
code > span.op { color: #666666; } /* Operator */
code > span.bu { } /* BuiltIn */
code > span.ex { } /* Extension */
code > span.pp { color: #bc7a00; } /* Preprocessor */
code > span.at { color: #7d9029; } /* Attribute */
code > span.do { color: #ba2121; font-style: italic; } /* Documentation */
code > span.an { color: #60a0b0; font-weight: bold; font-style: italic; } /* Annotation */
code > span.cv { color: #60a0b0; font-weight: bold; font-style: italic; } /* CommentVar */
code > span.in { color: #60a0b0; font-weight: bold; font-style: italic; } /* Information */
</style>
<link rel="stylesheet" href="style.css">
<!--[if lt IE 9]>
<script src="//cdnjs.cloudflare.com/ajax/libs/html5shiv/3.7.3/html5shiv-printshiv.min.js"></script>
<![endif]-->
<meta name="viewport" content="width=device-width">
</head>
<body>
<p>
<h1>增长工程师修炼之道</h1>
<p>Phodal Huang</p>
</p>
<div style="width:800px">
<nav id="TOC">
<ul>
<li><a href="#前言">前言</a><ul>
<li><a href="#我的成长四步曲">我的成长四步曲</a><ul>
<li><a href="#能做到你想做的-tasking与学习能力">能做到你想做的: Tasking与学习能力</a></li>
<li><a href="#用更好的方法来实现功能">用更好的方法来实现功能</a></li>
<li><a href="#better-code-architecture">Better Code & Architecture</a></li>
<li><a href="#growth-hacking">Growth Hacking</a></li>
<li><a href="#小结">小结</a></li>
</ul></li>
</ul></li>
<li><a href="#内容之美">内容之美</a><ul>
<li><a href="#人生苦短为何不写作呢">人生苦短,为何不写作呢?</a></li>
<li><a href="#分析篇什么样的文章受欢迎">分析篇:什么样的文章受欢迎?</a><ul>
<li><a href="#文章的类型">文章的类型</a></li>
</ul></li>
<li><a href="#创作篇写作的要点">创作篇:写作的要点</a><ul>
<li><a href="#文章类型">文章类型</a></li>
<li><a href="#写作要点">写作要点</a></li>
<li><a href="#文章排版">文章排版</a></li>
<li><a href="#收集灵感">收集灵感</a></li>
</ul></li>
</ul></li>
<li><a href="#写一个博客">写一个博客</a><ul>
<li><a href="#我的博客">我的博客</a><ul>
<li><a href="#现在我的博客是如何工作的">现在,我的博客是如何工作的?</a></li>
<li><a href="#微信公众平台">微信公众平台</a></li>
<li><a href="#技术组成">技术组成</a></li>
</ul></li>
<li><a href="#数据分析与收集">数据分析与收集</a><ul>
<li><a href="#google-analytics-webmaster">Google Analytics & WebMaster</a></li>
<li><a href="#apm-new-relic">APM: New Relic</a></li>
</ul></li>
</ul></li>
<li><a href="#转变硬件---后台---前端---混合应用---native-应用">转变:硬件 -> 后台 -> 前端 -> 混合应用 -> Native 应用</a></li>
<li><a href="#深入理解原理">深入理解原理</a></li>
<li><a href="#hello-world">hello, world</a></li>
<li><a href="#影响力">影响力</a><ul>
<li><a href="#分享和创造">分享和创造</a><ul>
<li><a href="#为什么人们关注你">为什么人们关注你?</a></li>
</ul></li>
<li><a href="#技术影响力赚钱">技术、影响力&赚钱</a><ul>
<li><a href="#代码写作与分享">代码、写作与分享</a></li>
</ul></li>
<li><a href="#提高影响力">提高影响力</a><ul>
<li><a href="#跨平台的平台id">跨平台的平台:ID</a></li>
</ul></li>
</ul></li>
<li><a href="#天天写业务代码的那些年我们是如何成长过来的">天天写业务代码的那些年,我们是如何成长过来的</a><ul>
<li><a href="#只修-bug-是怎样的一种体验">只修 Bug 是怎样的一种体验</a></li>
<li><a href="#组内技术活动">组内技术活动</a><ul>
<li><a href="#技术分享"><strong>技术分享</strong></a></li>
<li><a href="#workshop"><strong>workshop</strong></a></li>
<li><a href="#kata"><strong>kata</strong></a></li>
<li><a href="#dojo"><strong>dojo</strong></a></li>
</ul></li>
<li><a href="#花时间投入练习">花时间投入练习</a></li>
<li><a href="#假想项目的重构">假想项目的重构</a></li>
<li><a href="#小结-1">小结</a></li>
</ul></li>
<li><a href="#开源人生">开源人生</a></li>
<li><a href="#高效">高效</a><ul>
<li><a href="#目标">目标</a></li>
<li><a href="#激励自我驱动的秘诀">激励:自我驱动的秘诀</a><ul>
<li><a href="#需求与驱动力">需求与驱动力</a></li>
<li><a href="#识别你的内在激励">识别你的内在激励</a></li>
<li><a href="#action">Action</a></li>
</ul></li>
<li><a href="#有节奏的休息">有节奏的休息</a><ul>
<li><a href="#休息时间">休息时间</a></li>
<li><a href="#有节奏的休息-1">有节奏的休息</a></li>
<li><a href="#小结-2">小结</a></li>
</ul></li>
<li><a href="#精力管理">精力管理</a></li>
<li><a href="#习惯与快捷键">习惯与快捷键</a></li>
<li><a href="#碎片时间">碎片时间</a><ul>
<li><a href="#必然出现的碎片时间">必然出现的碎片时间</a></li>
<li><a href="#碎片时间应该怎么玩以收集为主">碎片时间应该怎么玩:以收集为主</a></li>
</ul></li>
</ul></li>
<li><a href="#练习的艺术">练习的艺术</a><ul>
<li><a href="#管理你的ideas">管理你的Ideas</a><ul>
<li><a href="#github管理idea">Github管理Idea</a></li>
</ul></li>
<li><a href="#程序员如何批量生产idea">程序员如何批量生产idea</a><ul>
<li><a href="#如何产生idea从只差程序员到不差idea">如何产生Idea:从「只差程序员」到「不差Idea」</a></li>
<li><a href="#对创新的练习产生idea">对创新的练习:产生Idea</a></li>
<li><a href="#开始记录你的问题idea">开始记录你的问题/Idea</a></li>
</ul></li>
<li><a href="#造轮子">造轮子</a><ul>
<li><a href="#从github生成轮子">从GitHub生成轮子</a></li>
</ul></li>
</ul></li>
<li><a href="#创建自己的产品">创建自己的产品</a><ul>
<li><a href="#growth-应用">Growth 应用</a></li>
</ul></li>
<li><a href="#专业">专业</a><ul>
<li><a href="#测试">测试</a></li>
<li><a href="#代码质量">代码质量</a></li>
</ul></li>
<li><a href="#三年职业编程生涯里遇到的那些挑战">三年职业编程生涯里,遇到的那些挑战</a><ul>
<li><a href="#实习同侪压力">实习:同侪压力</a></li>
<li><a href="#初入职场interview-和-coaching-新人">初入职场:Interview ++ 和 Coaching 新人</a></li>
<li><a href="#第二年be-profressional">第二年:Be Profressional</a></li>
<li><a href="#第三年lucky-unlucky">第三年:Lucky & Unlucky</a></li>
</ul></li>
<li><a href="#程序员你真的清楚你遇到的问题吗">程序员,你真的清楚你遇到的问题吗?</a><ul>
<li><a href="#问题来源的分类">问题来源的分类</a></li>
<li><a href="#如何去解决问题">如何去解决问题</a><ul>
<li><a href="#如何识别问题">如何识别问题</a></li>
<li><a href="#如何表述问题">如何表述问题</a></li>
<li><a href="#如何解决问题">如何解决问题</a></li>
</ul></li>
</ul></li>
<li><a href="#阅读">阅读</a><ul>
<li><a href="#为什么需要阅读">为什么需要阅读?</a></li>
<li><a href="#读书路线">读书路线</a></li>
<li><a href="#买什么书">买什么书?</a></li>
<li><a href="#如何阅读">如何阅读?</a></li>
<li><a href="#书看完之后呢">书看完之后呢?</a><ul>
<li><a href="#花钱买时间">花钱买时间</a></li>
</ul></li>
</ul></li>
<li><a href="#简历与面试">简历与面试</a><ul>
<li><a href="#如何写好简历">如何写好简历</a><ul>
<li><a href="#一份优秀的前端开发工程师简历是怎么样的">一份优秀的前端开发工程师简历是怎么样的?</a></li>
<li><a href="#简历的-n-种错误姿势">简历的 N 种错误姿势</a></li>
<li><a href="#打开姿势">打开姿势</a></li>
<li><a href="#程序员该如何去写自己的简历">程序员该如何去写自己的简历</a></li>
<li><a href="#小结-3">小结</a></li>
</ul></li>
<li><a href="#面试">面试</a></li>
<li><a href="#谈判">谈判</a></li>
</ul></li>
<li><a href="#技术演讲">技术演讲</a><ul>
<li><a href="#ppt的设计">PPT的设计</a></li>
<li><a href="#即时演讲">即时演讲</a></li>
<li><a href="#应对提问">应对提问</a></li>
<li><a href="#收集反馈">收集反馈</a></li>
</ul></li>
<li><a href="#工具箱">工具箱</a><ul>
<li><a href="#文档篇">文档篇</a></li>
<li><a href="#图形工具篇">图形工具篇</a></li>
<li><a href="#chrome插件篇">Chrome插件篇</a></li>
<li><a href="#ops">Ops</a></li>
<li><a href="#硬件篇">硬件篇</a></li>
<li><a href="#cli">CLI</a></li>
</ul></li>
<li><a href="#写一本书">写一本书</a><ul>
<li><a href="#如何去写">如何去写?</a></li>
<li><a href="#销量">销量</a></li>
</ul></li>
</ul>
</nav>
<h1 id="前言">前言</h1>
<h2 id="我的成长四步曲">我的成长四步曲</h2>
<p>在我成长初期,我制定了一些计划来实现下面的一些能力:</p>
<ol type="1">
<li>能做到你想做的: Tasking与学习能力</li>
<li>用更好的方法来实现功能</li>
<li>Better Code & Architecture</li>
<li>运营(Growth Hacker)</li>
</ol>
<p>除了第一步,每一个步骤都花费了相当长的时间来学习,光在学习方面就差不多一年了。</p>
<h3 id="能做到你想做的-tasking与学习能力">能做到你想做的: Tasking与学习能力</h3>
<p>虽然这看上去是一件很难的事,但是也不是一件很难的事。这也不依赖于你是否对某一个技术栈的理解,这只实际上只是学习能力的一种体现。</p>
<figure>
<img src="images/todo-example.png" alt="todo-example.png" /><figcaption>todo-example.png</figcaption>
</figure>
<p>在扯这些废话之前,先让我们来看看我们是如何实现一个功能、应用的。这也是在Growth里提到的Tasking:</p>
<ol type="1">
<li>有一个明确的实现目标。</li>
<li>评估目标并将其拆解成任务(TODO)。</li>
<li>规划任务的步骤(TODO)</li>
<li>学习相关技能</li>
<li>执行Task,遇到难题就跳到第二步。</li>
</ol>
<p>以本文的写作为例,细分上面的过程就是:</p>
<ol type="1">
<li>我有了一个中心思想——在某种意义上来说就是标题。</li>
<li>依据中心思考我将这篇文章分成了四小节。</li>
<li>然后我开始写四小节的内容。</li>
<li>直到完成。</li>
</ol>
<p>而如果将其划分到一个编程任务,那么也是一样的:</p>
<ol type="1">
<li>我们想到做一个xxx的idea。</li>
<li>为了这个idea我们需要分成几步,或者几层设计。</li>
<li>对于每一步,我们应该做点什么</li>
<li>我们需要学习怎样的技能</li>
<li>集成每一步的代码,就有了我们的系统。</li>
</ol>
<p>所以,实际上这并不是考验你技术能力的点,而是考验你如何划分任务和学习能力的点。在我不断地实现一个个系统的时候,最后我才意识到了这一点——学习能力和Tasking才是最重要的。换句话说,你现在学会什么并不重要,重要的是你以后有没有学习的能力。</p>
<p>有了一直想着过安逸的生活,所以就会安乐的死去。不过反正人生在世,自己开心就行,不要管别人怎么说。随后,我发现大部分我想到的都可以实现。</p>
<p>那么问题来了:</p>
<ol type="1">
<li>用铅笔写字也是写,用钢笔写字也是写,用电脑打字也是写——到底要用哪个工具来写。</li>
<li>用楷体来显示也是显示,用宋体显示也是显示——到底要怎样的实现。</li>
</ol>
<p>这实际上就是:用更好的方法来实现功能。</p>
<h3 id="用更好的方法来实现功能">用更好的方法来实现功能</h3>
<p>对于这一步来说,有太多的东西值得去探索:</p>
<ol type="1">
<li>更好的架构</li>
<li>更好的工具</li>
<li>更好的语言</li>
<li>。。。</li>
</ol>
<p>对于语言这一点上来说,Python和Ruby是两个不同的极端,不过看上Ruby是继承Perl的思想的基础上,就不多说了。Python,一个问题只有一个方法;Ruby,一个问题有几个方法。因而在这两个语言来,想要快感就用Ruby,还有近年来流行的Scala。想要便捷就是Python,不容易出现别的问题。</p>
<p>而这些只是我得到的结论,每个人都会得到不同听结论的。因而,探索是一件很有意思的事~~,如图:</p>
<figure>
<img src="images/civ5-worst.jpg" alt="civ5-worst.jpg" /><figcaption>civ5-worst.jpg</figcaption>
</figure>
<p>所以实际上,这一步是去探索一个更广阔的天空。我们需要知道不同的语言和技术栈的一些优势,了解并知道如何去应用即可。</p>
<p>如,以前我用的是Django的RESTful方案Tastypie管理来解决问题。后来,又发现了Django REST Framework,又用它实现了原来的逻辑。大四时,我发现PHP语言中的Laravel在RESTful这件事情上,似乎很有表现力,并且更容易“部署”——LNMP。接着实习时,发现Java在部署上更不错,它只需要一个Java包。而这个过程,只是出自于部署方面来考虑问题的。</p>
<p>即使现在我是一个使用Node.js的人,我还是觉得Java的打包就是优势。</p>
<p>在探索的过程中,我们就知道<strong>挖掘技术哪家强</strong>?</p>
<h3 id="better-code-architecture">Better Code & Architecture</h3>
<p>在实际编程的过程中,我们就会遇到很多代码问题。在这时,我们尽管有好的架构,然而并不能从根本上解决问题。只能保证从蓝图上看是对的,而不能导致质量问题。</p>
<figure>
<img src="images/better-architecture.jpg" alt="better-architecture.jpg" /><figcaption>better-architecture.jpg</figcaption>
</figure>
<p>代码的腐烂都是源自于平时的工作习惯问题,而在很多时候是需求导致的。这些看上去就是噩梦——加班,没有时间学习,效率低。没有时间学习,效率低,加班。</p>
<figure>
<img src="images/eff-worknight.png" alt="eff-worknight.png" /><figcaption>eff-worknight.png</figcaption>
</figure>
<p>而对于代码质量来说,也是如此的一种循环:</p>
<figure>
<img src="images/code-time.png" alt="code-time.png" /><figcaption>code-time.png</figcaption>
</figure>
<p>而在这时可以学的东西可多了,如Bad Smell,重构,设计模式,编写测试等等。</p>
<p>最后,我只得到了一个短句:</p>
<blockquote>
<p>重构到设计模式</p>
</blockquote>
<p>好的代码是重构出来的。</p>
<p>再往深层次之上就是架构,而架构往往是一种不容易得到的。尽管我看了一系列的书:</p>
<ul>
<li>《领域驱动设计》</li>
<li>《企业应用架构模式》</li>
<li>《领域特定语言》</li>
<li>《恰如其份的软件架构》</li>
<li>《面向模式的软件架构》</li>
<li>。。。</li>
</ul>
<p>最后,我还是依据一本书的书名,才领悟了一本书的书名《浮现式设计》。也是同样的话:</p>
<blockquote>
<p>好的架构是演进出来的。</p>
</blockquote>
<p>而这些都依赖于我们的实践,听信别人说的话,并不能让我们学会什么。只有自己做了,才知道什么是好,什么是不好。</p>
<h3 id="growth-hacking">Growth Hacking</h3>
<p>当我们有了一个好的Idea,一个好的架构以及一份良好的代码,并且我们还能将其执行下去。那么,我们还需要什么?</p>
<figure>
<img src="images/what-is-growth-hacking.jpg" alt="what-is-growth-hacking.jpg" /><figcaption>what-is-growth-hacking.jpg</figcaption>
</figure>
<p>这也是我现在正在尝试的领域,也是过去我想做的,但是却找不到一个好的方向。后来,想了想就有了Growth这个APP。毕竟从一个领域到一个新的领域,最好是通过现有的领域作为过渡。</p>
<p>自媒体正在最近几年内崛起,同时由于聚合网站的存在,信息在不断地爆炸。一个好的作品、文章要传播起来已经越来越越难了。</p>
<p>在现有的领域里,知乎、微博、公众号已经开始在垄断人们的碎片时间。一个东西可能在火了几天之后,你就很难得到他的信息了。</p>
<p>所以在适当的时候去推销,在适当的时候持续下去。</p>
<h3 id="小结">小结</h3>
<p>在那之前你需要明白的一点是,你要成为一个怎样的人?是行业的专家?还是领域的专家?等等!</p>
<figure>
<img src="images/cat-interest.jpg" alt="cat-interest.jpg" /><figcaption>cat-interest.jpg</figcaption>
</figure>
<p>我想的是一直可以做一些有趣的事,单纯深入一个垂直领域对我来说太枯燥了。对于我来说,我只会在造轮子的时候去研究一个轮子。而不是深入研究某个轮子,我会得到造某种轮子的方法。我只会在创造一些有意思的东西的时候,才会深入某个领域去学习。而不是为了深入某个领域,再去学习这个领域的知识 。。</p>
<p>每个人都可以用不同的方式成长,知道自己的喜欢的然后去计划。</p>
<h1 id="内容之美">内容之美</h1>
<h2 id="人生苦短为何不写作呢">人生苦短,为何不写作呢?</h2>
<h2 id="分析篇什么样的文章受欢迎">分析篇:什么样的文章受欢迎?</h2>
<h3 id="文章的类型">文章的类型</h3>
<h4 id="搜索引擎完成工作">搜索引擎:完成工作</h4>
<h4 id="聚合网站">聚合网站</h4>
<h4 id="社交与新媒体">社交与新媒体</h4>
<h4 id="小结-大连接">小结: 大连接</h4>
<h2 id="创作篇写作的要点">创作篇:写作的要点</h2>
<h3 id="文章类型">文章类型</h3>
<h4 id="技术细节型">技术细节型</h4>
<h4 id="干货型">干货型</h4>
<h4 id="实践总结型">实践总结型</h4>
<h4 id="杂谈与鸡汤型">杂谈与鸡汤型</h4>
<h3 id="写作要点">写作要点</h3>
<h4 id="标题">标题</h4>
<h4 id="小标题">小标题</h4>
<h4 id="内容函数体">内容——函数体</h4>
<h4 id="引言readme">引言——README</h4>
<h3 id="文章排版">文章排版</h3>
<h4 id="可读性">可读性</h4>
<h4 id="代码高亮">代码高亮</h4>
<h3 id="收集灵感">收集灵感</h3>
<h1 id="写一个博客">写一个博客</h1>
<p>过去曾经写过一系列的文章,试图去鼓励更多的人去写文章。从毕业前的《<a href="https://www.phodal.com/blog/think-of-rework-be-a-writer/">成为笔杆子</a>》、《<a href="https://www.phodal.com/blog/write-driven-learning/">写作驱动学习</a>》、《<a href="https://www.phodal.com/blog/rethink-why-write-blog/">重新思考博客的意义</a>》,到工作后的《<a href="https://www.phodal.com/blog/how-to-improve-impact/">如何提高影响力</a>》,都在试图去向人们展示写博客的可以促进自己学习、提高自己的影响力。</p>
<p>等到工作以后,发现想写的人是没有时间,不想写的人不存在时间。人们陷入生活的怪圈,越是加班越没有时间学技术,越是没有时间学技术越是需要加班。</p>
<p>我尚不属于那些技术特别好的人——我只是广度特别广,从拿电烙铁到所谓的大数据。不过相比于所谓的大数据,我想我更擅长于焊电路板,笑~~。由于并非毕业于计算机专业,毕业前的实习过程中,我发现在某些特殊领域的技术比不上科班毕业的人,这意味着需要更多的学习。但是后来受益于工作近两年来从没有加班过,朝九晚六的生活带来了大量的学习时间。在这个漫长的追赶过程中,我发现开发博客相关的应用带来了很大的进步。</p>
<h2 id="我的博客">我的博客</h2>
<h3 id="现在我的博客是如何工作的">现在,我的博客是如何工作的?</h3>
<h4 id="http服务器">HTTP服务器</h4>
<p>当你开发在网页上访问我的博客的时候,你可能会注意到上面的协议是HTTPS。</p>
<p>[blog-mobile][1]</p>
<p>但是并不会察觉到它是HTTP2.0。而这需要一个可以支持HTTP2.0的HTTP服务器,在不改变现在程序配置的情况下,你需要重新编译你的HTTP服务器。在这里,我的博客用的是Nginx,所以它在还只是试验版的时候,就已经被编译进去了。为了隐藏服务器的版本,还需要在编译的时候做了些手脚。除此,为了浏览器上的那个小绿锁,我们还需要一个HTTPS证书,并在Nginx上配置它。</p>
<p>在这时,我们还需要配置一个缓存服务器。过去,我在上面用过Varinsh、Nginx Cache。尽管对于个人博客来说,可能意义不是很大,但是总需要去尝试。于是用到了ngx_pagespeed,它会帮我们做很多事,从合并CSS、JS,到转图片转为webp格式等等。</p>
<p>Nginx对请求转发给了某个端口,就来到了WSGI。</p>
<h4 id="wsgi">WSGI</h4>
<p>接着,我们就来到了Web服务器网关接口——是为Python语言定义的Web服务器和Web应用程序或框架之间的一种简单而通用的接口。现在,你或许已经知道了这个博客是基于Python语言的框架。但是在我们揭晓这个答案之前,我们还需要介绍个小工具——New Relic。如果你在Chrome浏览器上使用Ghosty插件,你就会看到下面的东西。</p>
<p>[New Relic][2]</p>
<p>New Relic是一个网站监测工具,Google Analytics是一个分析工具。但是,不一样的是New Relic需要在我们启动的时候加进去:</p>
<pre><code>nohup /PATH/bin/newrelic-admin run-program /PATH/bin/gunicorn --workers=2 MK_dream.wsgi -b 0.0.0.0:8080 --timeout=300& </code></pre>
<p>现在这个请求总算来到了8080端口,接着到了Gunicorn的世界里,它是一个高效的Python WSGI Server。</p>
<p>过了上面几步这个请求终于交给了Django。</p>
<h4 id="django">Django</h4>
<p>Django这个天生带Admin的Web框架,就是适合CMS和博客。这并不意味着它的工作范围只限于此,它还有这么多用户:</p>
<p>[Who Use Django][3]</p>
<p>请求先到了Django的URL层,这个请求接着交给了View层来处理,View层访问Model层以后,与Template层一起渲染出了HTML。Django是一个MTV框架(类似于MVC之于Spring MVC)。接着,HTML先给了浏览器,浏览器继续去请求前端的内容。</p>
<p>它也可以用Farbic部署哦~~。</p>
<h4 id="angluar-material-design-lite-vs-bootstrap-jquery-mobile">Angluar & Material Design Lite vs Bootstrap & jQuery Mobile</h4>
<p>这是一个现代浏览器的前端战争。最开始,博客的前端是Bootstrap框架主导的UI,而移动端是jQuery Mobile做的(PS: Mezzanine框架原先的结构)。</p>
<p>接着,在我遇到了Backbone后,响应了下Martin Folwer的<strong>编辑-发布分离模式</strong>。用Node.js与RESTify直接读取博客的数据库做了一个REST API。Backbone就负责了相应的Detail页和List页的处理。</p>
<p>尽管这样做的方式可以让用户访问的速度更快,但是我相信没有一个用户会一次性的把技术博客看完。而且我博客流量的主要来源是Google和百度。</p>
<p>然后,我试着用Angular去写一些比较特殊的页面,如<a href="https://www.phodal.com/all/">全部文章</a>。但是重写的过程并不是很顺畅,这意味着我需要重新考虑页面的渲染方式。</p>
<p>最后,出现了Material Design Lite,也就是现在这个丑丑的页面,还不兼容新IE(微信浏览器)。</p>
<p>作为一个技术博客,它也用到了HighLight.js的语法加亮。</p>
<h4 id="api">API</h4>
<p>在构建SPA的时候,做了一些API,然后就有了一个Auto Sugget的功能:</p>
<p>[Auto Suggest][4]</p>
<p>或者说,它是一个Auto Complete,可以直接借助于jQuery AutoComplete插件。</p>
<p>或许你已经猜到了,既然我们已经有博客详情页和列表页的API,并且我们也已经有了Auto Suggestion API。那么,我们就可以有一个APP了。</p>
<h4 id="app">APP</h4>
<p>偶然间发现了Ionic框架,它等于 = Angluar + Cordova。于是,在测试Google Indexing的时候,花了一个晚上做了博客的APP。</p>
<p>[Blog App][5]</p>
<p>我们可以在上面做搜索,搜索的时候也会有Auto Suggestion。上面的注销意味着它有登录功能,而Hybird App的登录通常可以借用于JSON Web Token。即在第一次登录的时候生成一个Token,之后的请求,如发博客、创建事件,都可以用这个Token来进行,直到Token过期。如果你是第一次在手机上访问,也许你会遇到这个没有节操的广告:</p>
<p>[Install Phodal Blog App][6]</p>
<p>然并卵,作为我的第七个Hybird应用,它只发布在Google Play上——因为不需要审核。</p>
<p>随后,我意识到了我需要将我的博客推送给读者,但是需要一个渠道。</p>
<h3 id="微信公众平台">微信公众平台</h3>
<p>借助于Wechat-Python-SDK,花了一个下午做了一个基础的公众平台。除了可以查询最新的博客和搜索,它的主要作用就是让我发我的博客了。</p>
<p>[Phodal QRCode][7]</p>
<p>对了,如果你用Python写代码,可以试试PyCharm。除了WebStorm以外,我最喜欢的IDE。因为WebStorm一直在与时俱进。</p>
<h3 id="技术组成">技术组成</h3>
<p>So,在这个博客里会有三个用户来源,Web > 公众号 > App。</p>
<p>在网页上,每天大概会400个PV,其中大部分是来自Google、百度,接着就是偶尔推送的公众号,最后就是只有我一个人用的APP。。。</p>
<blockquote>
<p>Web架构</p>
</blockquote>
<p>服务器:</p>
<ol type="1">
<li>Nginx(含Nginx HTTP 2.0、PageSpeed 插件)</li>
<li>Gunicorn(2 Workers)</li>
<li>New Relic(性能监测)</li>
</ol>
<p>DevOps:</p>
<ol type="1">
<li>Farbic(自动部署)</li>
</ol>
<p>Web应用后台:</p>
<ol type="1">
<li>Mezzaine(基于Django的CMS)</li>
<li>REST Framework (API)</li>
<li>REST Framework JWT (JSON Web Token)</li>
<li>Wechat Python SDK</li>
<li>Mezzanine Pagedown (Markdown</li>
</ol>
<p>Web应用前台:</p>
<ol type="1">
<li>Material Design Lite (用户)</li>
<li>BootStrap (后台)</li>
<li>jQuery + jQuery.autocomplete + jquery.githubRepoWidget</li>
<li>HighLight.js</li>
<li>Angluar.js</li>
<li>Backbone (已不维护)</li>
</ol>
<p>移动端:</p>
<ol type="1">
<li>Ionic</li>
<li>Angular + ngCordova</li>
<li>Cordova</li>
<li>highlightjs</li>
<li>showdown.js(Markdown Render)</li>
<li>Angular Messages + Angular-elastic</li>
</ol>
<p>微信端:</p>
<ol type="1">
<li>Wechat-Python-SDK</li>
</ol>
<h2 id="数据分析与收集">数据分析与收集</h2>
<h3 id="google-analytics-webmaster">Google Analytics & WebMaster</h3>
<h3 id="apm-new-relic">APM: New Relic</h3>
<h1 id="转变硬件---后台---前端---混合应用---native-应用">转变:硬件 -> 后台 -> 前端 -> 混合应用 -> Native 应用</h1>
<blockquote>
<p>转变是一件很简单的事,当你觉得是时候时。</p>
</blockquote>
<p>最近的几星期里,在集成一个第三方的 SDK 到我们的混合应用里。这就意味着:要继续和繁琐的 Java折腾,要开始编写 Objective-C,并和难用的 XCode 的作斗争。</p>
<p>大学的时候,因为参加一个硬件的比赛,还在用 Nokia 的我,买了一个古董 HTC G1 开始学习 Android 应用开发。等完成比赛后,几乎就不再编写相关的代码了。</p>
<h1 id="深入理解原理">深入理解原理</h1>
<h1 id="hello-world">hello, world</h1>
<h1 id="影响力">影响力</h1>
<p>影响力 => 可信度和信任</p>
<h2 id="分享和创造">分享和创造</h2>
<h3 id="为什么人们关注你">为什么人们关注你?</h3>
<h2 id="技术影响力赚钱">技术、影响力&赚钱</h2>
<h3 id="代码写作与分享">代码、写作与分享</h3>
<h2 id="提高影响力">提高影响力</h2>
<h3 id="跨平台的平台id">跨平台的平台:ID</h3>
<h1 id="天天写业务代码的那些年我们是如何成长过来的">天天写业务代码的那些年,我们是如何成长过来的</h1>
<blockquote>
<p>比起写业务代码更不幸的是,主要工作是修 Bug,bug,buG, bUg。</p>
</blockquote>
<p>在一家大的公司里,不同的人总会有不同的运气:</p>
<ul>
<li>运气好的人遇上一个好的项目,升职加薪,从此就走上了人生的巅峰。</li>
<li>运气差的人摊上一个差的项目,升不了职,少加了薪,并且还获得不了技术成长。</li>
</ul>
<p>我刚毕业那会儿,所在团队的主要工作是,维护一个『又老又旧』的系统。比起写业务代码更不幸的是,我们的主要工作是修 Bug,bug,buG, bUg。</p>
<p>那一年多里,尽管都是维护旧系统和少量的新需求,我们还是在飞速的成长~~。而来源主要是:</p>
<ul>
<li>组内技术活动。</li>
<li>花时间投入练习。</li>
<li>假想项目的重构。</li>
</ul>
<p>当你在有限的条件下,还能做出一定的成绩,到底还是相当有成就感的。</p>
<h2 id="只修-bug-是怎样的一种体验">只修 Bug 是怎样的一种体验</h2>
<p>在这样的项目里:</p>
<ul>
<li>工作一个月时,你打开 Backlog,看看需求卡,发现那张需要三个人天的卡,好像会更有挑战一些。</li>
<li>工作两个月时:你打开 Backlog,看看需求卡,发现完成这卡只是时间问题。</li>
<li>工作三个月时:你打开 Backlog,看看需求卡,发现清清楚楚地知道修改哪一行。</li>
</ul>
<p>有一天,业务人员来了一个新的需求。虽然只是加上一个新的导航,但是你总会小开心一会儿。</p>
<p>可你来到这样的项目时,你总会想着离开,向自己的 Buddy、PM 、Sponsor 诉说。可惜,你只是一个毕业生,太年轻了。对于你来说有挑战性的项目,不会考虑要你的。在你的感觉里,那种『自己是大公司的轮子』的感觉就特别强烈。多你一个不多,少你一个不少。你走了也不会影响这个项目,毕竟招一个人来修 bug,还是蛮轻松的。因此,这个项目走了一个又一个技术好的人,却也来不了一个技术好的人。</p>
<p>时间一久,每个人都充满了危机感。我们总是担心:<strong>当你换到另外一个项目的时候,别的项目 PM 会考虑你么</strong>——因为你是来自这个没有挑战性的项目。这个时候,你已经无路可走了,<strong>你必须去提高你自己</strong>。</p>
<p>当别人救不了你的时候,你只能自救。当别人救不了你们的时候,你们也只能自救。幸运的是,我们当时还有足够的时间,可以提高项目组的水平。于是,我们对组织了<strong>各种的组内技术分享、workshop、培训等等</strong>。</p>
<p>当你有强烈的改变意识的时候,那么事件就会变得很简单。真正可怕的是温水煮青蛙式的,而当你面对的是温水,你总会不断尝试去离开。</p>
<h2 id="组内技术活动">组内技术活动</h2>
<p>当你们项目无聊的时候,总会空余一些时间。上进一点,就会创造一些学习的条件。有了条件,那么剩下的就是靠人为了。</p>
<p>于是乎,我们在每周挑取了两个时间,做一些技术的事情。包含了下面的一些内容:</p>
<ul>
<li>技术分享。</li>
<li>workshop。</li>
<li>kata。</li>
</ul>
<p>不同的活动都有不同的目的,有的可以提高演讲者的技术能力,有的则是可以一起提升能力。下面就让我们详细了解一下不同的活动。</p>
<h3 id="技术分享"><strong>技术分享</strong></h3>
<p>想必大家都已经知道这个是什么了~~。当时的情况,大概是我们七个人里,每周会有两次技术分享。分享的主题会比较广泛:</p>
<p><strong>你最近在玩的技术栈</strong>。当你们所用的项目技术栈,比较老旧的时候,就想不断地去尝试新的技术。在工作之外,便会去玩一些『新鲜』的技术栈(坑)。它就像是一股清流,即使不能帮你清除旧的污水,也能让人们看到一丝希望。而且除了能提升团队的视野,还可以将之视为替换现有架构的探索。</p>
<p><strong>项目相关的技术及业务</strong>。在没有结对编程的项目里,共享知识对于团队来说是一个头疼的问题,而技术分享就是最简单的方式。不过,对于新人来说,<strong>让他们做相关的技术分享才是最好的方式。</strong>这也视作为我们对新人的考察:</p>
<ul>
<li>对于项目的了解程度</li>
<li>找到缺少的相关知识</li>
<li>培养新人的表达能力</li>
</ul>
<p>在项目上,这几乎是每个新人都会经历的一个分享~~。</p>
<p><strong>特定主题的技术分享</strong>。即,我们限定好一个大的主题,每个人挑选一个特定的主题来分享,它可以人为地提高整个组在某一领域的水平。当时我们做过 SOLID、设计模式、前端相关等特定主题的分享——每个人挑选设计模式中的一个模式,然后做相关的技术分享。当你做分享的时候,你对这模式就比较了解;而别人做分享的时候,也能引发你的思考。由于这些主题之间的相关性比较强,它可以加深对这一领域的印象。</p>
<p><strong>其他杂七杂八的内容</strong>。过多的技术分享,可能会导致大家精疲力尽,因此就会有一些技术之外的分享。比如,你喜欢的各种动漫啊、知乎上流行的程序员女装啊等等。</p>
<p>而就效果来说,技术分享对于分享者的能力提升比较大,听众则是知道有这个东西,启发性一般都会比较少。如果是针对于提升能力来说,应该采用 workshop 等方式。</p>
<h3 id="workshop"><strong>workshop</strong></h3>
<p>当项目上要采用一个新的技术栈时,仅仅中是一个技术分享是不能解决问题的,你还需要有 workshop 这样的东西。比如你们将在新的项目里引入 Next.js,那么这个时候就需要有一个 Next.js Workshop。由组织者来规划每一步的内容,第一步做什么,第二步做什么,等等。参与者则是单独或者结对的形式,按照组织者的步骤一步步往下来做相关的技术练习。比如在 workshop 开始前,先 clone 并搭建好基础代码(hello, world)。开始的时候,便是先实现一个简单的 header,然后是添加样式等等。</p>
<p>也因此在这样的 workshop 里,我们不仅可以听过相关技术栈的知识,也能掌握一些相关技术栈的具体实践。</p>
<h3 id="kata"><strong>kata</strong></h3>
<p>一种编程练习方式,针对某个题目反复进行操练,达到熟能生巧的目的。简单的来说,就是你一直练习某一个特别的东西,直到你习惯了。比如,对于 TDD(测试驱动开发,先写测试,并由测试驱动出功能) 的练习。</p>
<p>在平时工作的时候,我们不会总是习惯于 TDD 的流程:测试 -> 实现 -> 重构。特别是,当你的卡就要被打包到新的 Release 包时,<strong>先实现总是会保证交付的</strong>。又或者是,当你对代码库特别熟悉的时候,你可能两三分钟就改完代码,然后去喝咖啡,再回来花个十几分钟写一个测试。而当你不熟悉 TDD 的时候,你更不会采用这种方式,你会的可能就是 Test First。为了将 TDD 的思维融入你的想法里, 你就需要大量的这种练习~~。</p>
<p>在这个时候,我们就需要严格的按照步骤,一步步往下执行。以便于在将来,我们可以严格的按照这些步骤来执行。</p>
<p>除此,还有一种方式可以做,只是我们没有在这个项目里实施。</p>
<h3 id="dojo"><strong>dojo</strong></h3>
<p>dojo,(日语:道场)。在西方世界,dōjō 一词主要指的是一个专门针对日本武术的训练场所。在敏捷团队里,Dojo 的进行方式比较『诡异』,也比较有意思。</p>
<p>如果你了解过结对编程的话,可能就会对两个人的结对过程比较感兴趣。按我的理解,结对编程存在着三种不同的阶段:teaching(引入门),driver-navigator(有经验与新手),结对(有经验与有经验)。即在实现功能的时候,两个人会轮流写测试和实现功能——你先写测试,我实现功能,然后换角色。而 Dojo 就是一堆人在轮流写代码:</p>
<figure>
<img src="https://phodal.github.io/growth-engineer/images/agile-dojo.jpg" alt="Dojo" /><figcaption>Dojo</figcaption>
</figure>
<p>即在有限的时间里,每个人上去实现同一功能的代码。</p>
<p>如,A 实现了测试,B 上去实现业务,C 上来重构。D 上来看了看,你们写的代码都是 xx,于是 Revert 之前写的代码。可惜 D 的时间也只有七分钟,所以 E 上来 Revert Revert。。。</p>
<figure>
<img src="https://phodal.github.io/growth-engineer/images/git-revert.png" alt="Git revert revert" /><figcaption>Git revert revert</figcaption>
</figure>
<p>笑~~</p>
<h2 id="花时间投入练习">花时间投入练习</h2>
<p>限于之前已经有相当多的文章,介绍练习相关的技巧,如:</p>
<ul>
<li>《<a href="https://mp.weixin.qq.com/s?__biz=MjM5Mjg4NDMwMA==&mid=404434547&idx=1&sn=a68b9b1c37b3e7b3f3f9574d6d5a140d&scene=21#wechat_redirect">GitHub连击500天:让理想的编程成为习惯</a>》</li>
<li>《<a href="https://mp.weixin.qq.com/s?__biz=MjM5Mjg4NDMwMA==&mid=2652973649&idx=1&sn=baee962481ae6c28e0af83bd1b059120&scene=21#wechat_redirect">关于编程,你的练习是不是有效的?</a>》</li>
<li>《<a href="https://mp.weixin.qq.com/s?__biz=MjM5Mjg4NDMwMA==&mid=2652973579&idx=2&sn=ff167c628bb8339515b4c7931dc605cb&scene=21#wechat_redirect">我的成长四步曲</a>》</li>
<li>《<a href="https://mp.weixin.qq.com/s?__biz=MjM5Mjg4NDMwMA==&mid=2652973461&idx=1&sn=a499f4594436c853ae3d1fa88155cc7c&scene=21#wechat_redirect">我并不聪明,只是多练习和思考</a>》</li>
</ul>
<h2 id="假想项目的重构">假想项目的重构</h2>
<p>哈哈,如果你觉得你的项目技术栈老旧,那么你一定在脑子里使用了 N 种技术栈,对他们进行重构了。并且当你有一些时间可以分配到上面,如下班前的一个小时时间,又或者黑客马拉松等等。那么,你一定会开始去做这样的事。</p>
<p>与上面的技术活动相比,这是一个对于业务(我的意思是,对于公司来说)更有价值,并且更容易说服别人的方式。</p>
<ol type="1">
<li>学习别的项目的技术栈,然后将之应用到现有的系统上。</li>
<li>使用一个新的技术栈练习, 以此作为技术支撑,在未来替换现有的系统。</li>
</ol>
<p>由于我们与其他项目大组的业务是相似的,并且他们的团队规模差不多是我们的 10 倍。当某个新的应用完成后,我们要做的便是:<strong>fork from xx</strong>,将改吧改吧,应用到我们现有的模式上。这个时候就有问题了,一般这些新的项目都会采用最新的技术栈。在正式引入项目之前,我们都是要学习这些技能,并配合业务做一些修改。也因此,我习惯性的将这种项目视为修改 bug、bUg、Bug。</p>
<p>后来,我们突然有机会弯道超车了,我们可以先重构某一部分系统。『因为已经做好相关的技术积累,并没有遇上一些太大的问题』。只是我们实施一半的时候,就发生了一些意外<del>。后来的后来,这个项目“到期结束”了</del></p>
<p>现在是 2017 年,当你的项目还在使用旧的 jQuery + Backbone,又或者是 Angular 1.x。并且你们觉得他们有一些问题,这些问题采用一些新的框架,如 Angular 2,又或者是 React 能解决这个问题的话。这个时候,我们就可以尝试去学习新的技术栈,并验证它的可行性。当有一天,你们需要去重构现有系统的时候,你拿出的直接是一个可行性的 Demo,而不仅仅是一个理论上的东西。</p>
<p>当时我们的项目想替换掉旧的搜索引擎,我们先是用 Solr 实现了一遍 DEMO,又用 ElasticSearch 做了一遍 DEMO。同时,我们也在计划替换应用部分的功能,我们先用 React 实现了一遍 DEMO,又尝试用生态纯静态的方式玩了一遍。。。生命可贵,可以多玩就多玩一些吧。</p>
<h2 id="小结-1">小结</h2>
<p>所以,你是因为加班呢,还是因为加班,才没有时间学习???</p>
<h1 id="开源人生">开源人生</h1>
<h1 id="高效">高效</h1>
<h2 id="目标">目标</h2>
<h2 id="激励自我驱动的秘诀">激励:自我驱动的秘诀</h2>
<blockquote>
<p>一年多以前,参加过公司的一个『Management 3.0』培训。遗憾的是,没学会怎么当管理者,倒是学会了怎么驱动自己去做更多的事。</p>
</blockquote>
<h3 id="需求与驱动力">需求与驱动力</h3>
<p>人呐,<strong>主动做事</strong>的时候,总会有动机的。如果不挨冻、不挨饿,吃饭,睡觉这种事就不需要动机的。</p>
<ol type="1">
<li>单身的时候,主动去和异性说话,可能想的不仅仅只是交流交流——还有可能想找个人分摊房租。</li>
<li>刚毕业的时候,多加点班多赚点钱,可能不仅仅是因为想多学点东西——还有可能是穷。</li>
<li>写代码的时候,想写得更简洁一点,可能不仅仅是为了提高水平——还有可能是太长了,自己就看不懂了。</li>
</ol>
<p>这就是内在的驱动力,让自己朝着自己所期望的目标前进。如我过去的 GitHub,我就是要 365 天都在写代码。</p>
<p>它往往比多数的外部激励更加有效。工作多年的你,可能希望少涨一些工资,因此便少加一些班。因为少加一些,你就可以:</p>
<ul>
<li>腾出点时间去与白富美约会,迎娶白富美</li>
<li>腾出点时间去学习技术,当上 CTO</li>
<li>腾出点时间去走上人生巅峰</li>
</ul>
<p>好了,应该醒醒了,看看现在的你:整天提不起精神,不想写代码,也不想加班,回家了也不知道干什么。这仿佛就是学生时候的写照啊,上课的时候想着放假,可以去哪里玩,可以从某个亲戚那里拿红包;放假的时候,想着回学校看哪个美女,和谁一起去玩。除此,你还会记得你做过什么吗?</p>
<p>学习的时候,不情愿的去上课;工作的时候,不情愿的去上班。</p>
<p>好在事情并没有那么糟糕。让我们想想,你什么时候会去主动地做一些事情:</p>
<ul>
<li>因为房租涨了的缘故,你便想着多赚一些钱</li>
<li>因为涨工资的缘故,你开始去接触更深的技术</li>
<li>因为 KPI 的缘故,你主动地去做了一些工作</li>
</ul>
<p>在这个过程中,你会发现有一股无形的力量在驱动着你,只是它们都是一些外在的激励。也是我们在生活中常见的激励,『干得好给你多涨工资』、『准时打卡多点奖金』、『成绩好一点排名就靠前』等等。</p>
<p>外部激励是在集体中最容易实现的,也是最常见的。但是效果往往不会那么理想,只有你真正想成长的时候,你才会去成长。</p>
<h3 id="识别你的内在激励">识别你的内在激励</h3>
<p>而为了正确的激励你自己,你就需要识别出真正能影响你的内在驱动力因素。在《管理 3.0》一书中提到了十条,团队内部成员的十大需求。你需要从中选出你觉得最重要的因素,然后按顺序排好。在培训的时候,这些内容会被打印成卡片,然后两个成员一组,一个成员向另外一个成员(最好是不熟悉的两个人)解释原因。</p>
<p>这十条内容分别是:</p>
<p>即:</p>
<ul>
<li>好奇心(Curisority)。</li>
<li>荣誉感(Honor)。</li>
<li>认可(Acceptance)。</li>
<li>掌握(Mastery)。</li>
<li>权力(Power)。</li>
<li>自由(Freedom)。</li>
<li>相关性(Relatedness),即多与人交流。</li>
<li>秩序(Order)。</li>
<li>目标(Goal)。</li>
<li>地位(Status)。</li>
</ul>
<p>虽然这些内容都是被限定在团队范畴里的,但是我们也可以将这些内容应用到自己身上。现在,你可以从中选出最重要的三个原则,并按顺序排好。</p>
<p>我的顺序是:自由、好奇心、目标。</p>
<ul>
<li>自由。如现在的不加班的生活,我可以自由安排大量的时间。又如写代码是一种很无聊、乏味的工作,但是在自己掌控的代码中,我们仍然可以获得相当大的自由度。还可以有大量的时间,自由的去玩工具、造轮子。</li>
<li>好奇心。我就是想拆拆看这个电脑,看看里面有什么东西不一样。</li>
<li>目的。当你计划着去某个地方、实现某个功能、达成某个成就。嗯,就是这样,实现它。</li>
</ul>
<p>有意思的是,其中有一些可能有点相似,请注意~~。注意二:在不同的时期,上面的内容都会有一些变化的。</p>
<p>你的顺序会是怎样的?</p>
<h3 id="action">Action</h3>
<p>如果你想要的是荣誉感,那么你应该多参加一些活动。</p>
<p>如果你想要的是地位,那么你应该设法去做更多的领导尝试。</p>
<p>如果你想要的是相关性,那么你应该多去与周围的人交流。</p>
<p>我又编不下去了。不过,我相信你应该能找到对你来说,最重要的点。</p>
<h2 id="有节奏的休息">有节奏的休息</h2>
<p>经常被问及为什么我可以做这么多的事,换句话来说也就是为什么效率这么高?过去我的答案里,要么是<strong>手快</strong>,要么是<strong>不加班</strong>。后来,我发现事情并没有这么简单,于是我便想着写几章文章整理整理。</p>
<p>在过去的两年里,保持了GitHub近两年的连击,存档了上百个项目,还凭借18k个star上榜“GitHub Star榜Top 100”。除此,审阅了两本物联网相关的书,编写了一本物联网相关的书,和基友一起翻译了一本硬件相关的书、一本物联网相关的书,在GitHub上写了开源的电子书。</p>
<p>保持高效的第一要点是,<strong>休息</strong>。问题是我们可以怎样休息呢?</p>
<ul>
<li>睡觉</li>
<li>吃饭</li>
<li>走路</li>
<li>洗澡</li>
<li>…</li>
</ul>
<p>这些都可以是休息。当我们讨论休息的时候,并不是指在睡觉。只要不是在忙与当前编码相关的事务,那么我们就是在休息。事实上,我们可以将“休息”这个词转变化<strong>恢复精力</strong>——这才是高效的第一要点。</p>
<h3 id="休息时间">休息时间</h3>
<p>先让我们来看看在一天里,我们有多少时间是在休息的?</p>
<ul>
<li>睡觉,这是最基本的</li>
<li>吃饭,一天三次。吃饭还得排队,又是一个多好的时间。如果你加班的话,那么你可能就是四次了。</li>
<li>上下班时间。如果你离公司很近,那么你可以在下班的时候去逛逛。</li>
<li>午休,运气好的话,你还可以在桌上趴会。</li>
<li>喝水、上厕所等等。</li>
</ul>
<p>让我们来计算一下,大致时间花费:</p>
<ul>
<li>睡觉,7~8个小时</li>
<li>吃饭,3 * 15分钟左右 = 45分钟</li>
<li>上下班时间,0.5小时 * 2 = 1小时</li>
<li>午休,0.5~1小时</li>
<li>喝水、上厕所,一天加起来也不会超过0.5小时吧。</li>
</ul>
<p>这样算下来,一天有一半的时间都可以是休息时间。如果真的可以这样的话,那么我想你不会遇到效率的问题了~~。</p>
<h4 id="我的作息">我的作息</h4>
<p>之前在西安时,我作息差不多是这样的:</p>
<ul>
<li>早上七点钟起床,刷牙洗漱,然后刷GitHub,八点出门坐车。</li>
<li>中午十二点半吃完饭,休息半个小时左右,刷刷GitHub,或者在翻译书。</li>
<li>下午六点下班,早期坐公交回到家里,吃完饭会先睡一觉。因为是开着灯睡的,大概就十分钟左右。后来,坐上“小猪巴士”,直接在车上<strong>睡一觉</strong>。</li>
<li>晚上,八点半左右才会开始写代码,十一点半上床睡觉——99%的时间是不熬夜的。</li>
</ul>
<p>熬夜,对于我来说基本是百害而无一益,很容易影响第二天的体能和思维。因此从某种程度上来说,可以保证我有足够的精力。</p>
<p>而到了深圳后,主要的变化就是下班后,变成了六点走回家——50分钟左右,主要目的就是改善体能。由于这个季节,深圳的温度比西安高,回到住的地方睡不着~~,还在培养中。</p>
<p>并且在晚上时,有了更多的改变:</p>
<ul>
<li>忙时,十一点合上电脑、手机静音,拿起Kindle或者纸质书阅读,或者白纸装逼。</li>
<li>闲时,十点便开始看书了。</li>
</ul>
<p>毕竟,对于像我这样内向性格的人来说,独处才能恢复精力。对于外向性能的人来说,可能出去找几个朋友High一下就能恢复精力。</p>
<h3 id="有节奏的休息-1">有节奏的休息</h3>
<p>当你发现你养成习惯后,你就很容易进入状态。比如我在10点时,很容易就可以进入写作状态。当我按时11点半睡觉,我就可以很快进入状态,这些都是习惯造就的。</p>
<h4 id="按时睡觉">按时睡觉</h4>
<p>小时候,我们都是9点钟上传睡觉的,5,6点多起床。。。然后去叫叫隔壁的大哥哥,大姐姐出去玩。</p>
<p>长大了,我们都是11点钟上传睡觉的,然后7,8点起床。。。然后被隔壁的小屁孩叫醒。</p>
<p>从整体上来,熬夜会对身体和精神产生相对比较大的影响。如果你对<strong>星期一综合症</strong>或者<strong>假期综合症</strong>有所了解的话,那么你就会知道,只是因为你改变了习惯。</p>
<p>当然,如果你已经习惯了长期熬夜,并且没有负作用,那么你还是相当不错的~~。</p>
<p>这让我想到了猫,所以猫白天根本不理你了~~。</p>
<h4 id="番茄工作法">番茄工作法</h4>
<p>番茄工作法对于我来说,不是那么管用——天生喜欢多动,并且每天我的事务比较单一,就是编码。之所以会出现在这里,是因为它对健康有益。</p>
<p>我正式采用番茄工作法的原因是,在客户现场工作时,影响到颈椎了,加之我在改善尺神经卡压的影响。</p>
<p>这一点特别适合在工作上用,每工作25分钟,就可以休息5分钟。</p>
<p>所以,请使用番茄工作法作为合理的休息理由吧~~。对自己狠一点,就是对资本家好一点——除非你是资本家。</p>
<h4 id="碎片时间---玩吧">碎片时间 -> 玩吧</h4>
<p>碎片时间就适合刷刷朋友圈、逛逛微博、看看美女,看书什么的一点都不适合。</p>
<p>碎片时间根本不适合学习!</p>
<p>碎片时间根本不适合学习!</p>
<p>碎片时间根本不适合学习!</p>
<p>学习需要有高度集中的时间,你才能集中精力学习。</p>
<p>对了,如果你没有女朋友的话,那么你应该趁这个时间找人多聊聊天天。</p>
<h4 id="适当的有氧运动">适当的有氧运动</h4>
<blockquote>
<p> 每天应该适当做点有氧运动,如果没有女朋友的话,那么你应该出去跑步、散步啊。</p>
</blockquote>
<p>只所以强调适当是因为,大量地运动不仅需要占用了你相当多的运动时间,你仍然需要相当多的时间来恢复。</p>
<p>而有氧运动并不仅仅局限于传统意义上的运动:跑步、打球,还可以是拖拖地。</p>
<p>如我最近在家里练习羽毛球颠球——转移眼睛的注意力,也算是适当的有氧运动。遗憾的是,不能在工作的地方练习。</p>
<h3 id="小结-2">小结</h3>
<blockquote>
<p>最近软件行来的的用人趋势是把人当成富士康工人用。</p>
</blockquote>
<p>要成为一个大牛,就需要准备一场长期的战斗,培养自己的状态。而不是在华为干个十几年出来了,再用这十几年赚的钱去买健康,一不小心挂了怎么办?</p>
<p>要知道,你已经错过进入大公司最好的时机了——现在进去只能成为新一代的<strong>富士康工人</strong>。<strong>你对外所说的每一句话,每一张截图,将成为你被Fire的证据。</strong></p>
<h2 id="精力管理">精力管理</h2>
<h2 id="习惯与快捷键">习惯与快捷键</h2>
<h2 id="碎片时间">碎片时间</h2>
<p>相信你已经从很大途径了解到了:“<strong>利用碎片化时间学习</strong>”是一个陷阱。这是一个非常有趣的事实,但是也不非可利用,比如说:聊天。那么,除了聊天我们还可以玩点什么?屏蔽朋友圈里你老板以外的咪蒙粉;到 GitHub 上给自己的开源项目点个赞;上知乎看看段子、发发广告;到微博看看前端娱乐圈。</p>
<p>除了利用碎片化时间是一个陷阱外,避免碎片化时间又是另外一个陷阱。</p>
<h3 id="必然出现的碎片时间">必然出现的碎片时间</h3>
<p>编程作为一个脑力工作,在工作了一段时间后,你会很容易发现:<strong>感觉身体被掏空了</strong>。然后,你的注意力就会越来越不集中,你会想着用喝咖啡的方式来提神,会强迫自己去集中注意力。但是,这一切都于事无补。</p>
<p>然后,你就这样开始了糟糕的后半段时间了。于是,你就觉得你度过了糟糕的一天。</p>
<p>到底是哪里不对劲?你以为你是个机器,实际上你是一个人——一直百分之百运行的 CPU,也是会减寿的。</p>
<p>你需要一个短暂的休息——这就是为什么番茄工作法这么受欢迎的原因:<strong>保持高效</strong>。</p>
<p>既使你有一定的工作经验,也是如此。而在这时,有一个东西会影响你的工作与休息的时间,即心流:</p>
<figure>
<img src="images/flow-basic.jpeg" alt="心流" /><figcaption>心流</figcaption>
</figure>
<p>当然,这是可遇不可求的,就好比是你和你的女神聊在一起了一样。</p>
<p>那么问题来了,我们如何来处理这些碎片化的时间。</p>
<h3 id="碎片时间应该怎么玩以收集为主">碎片时间应该怎么玩:以收集为主</h3>
<p>当我们有5<sub>15分钟的碎片时间,那么你想的当然是来提高自己,而在这时最合适的方式就是:收集一些感兴趣的内容——做一个简单的判断,然后将需要的内容进行归类。如你可以将你所需要的鸡汤放到一起,来一锅大的鸡汤</sub>~。碎片时间可以干很多事情:</p>
<ul>
<li>屏蔽朋友圈里你老板以外的咪蒙粉</li>
<li>到 GitHub 上给自己的开源项目点个赞</li>
<li>上知乎看看段子、发发广告</li>
<li>到微博看看前端娱乐圈</li>
</ul>
<p>在那之前,我们需要注意一些事项:</p>
<p><strong>避免阅读</strong>。任何需要思考的内容都是不合适的,编程是一个脑力活。当然笑话除外:</p>
<blockquote>
<p>小侄子早上打了个喷嚏,看他鼻子酸的要哭,我安慰他说,那是因为我在想他,他才会打喷嚏,, 下午带他出去玩,一个卖烧烤的小伙子打了两个喷嚏,这孩子冲上前去就跟人家说:“你知道吗?是我姑姑在想你呢!”</p>
</blockquote>
<p><strong>避免思考问题</strong>。如果有一个问题你一直无解的话,那么估计你需要一些额外的灵感,需要一些额外的知识汲入——这些知识可能与你现有的知识是无关的。</p>
<h4 id="github-trending">GitHub Trending</h4>
<p><strong>最适合碎片阅读的,莫过于 GitHub Trending</strong>。你可以在上面看到,最新的一些流行的开源项目, 如: HTTP 状态码451:基于法律上的原因,我不能向你展示网页内容。</p>
<p>GitHub Trending 在这方面做得特别好,有一个项目的名称和简介,只需要看一眼就够了:</p>
<figure>
<img src="images/github-trending.png" alt="Growth" /><figcaption>Growth</figcaption>
</figure>
<p>能打开项目的,说明你是有兴趣的~~,加入你的 TodoLists 吧,如下:</p>
<h4 id="维护自己的-awesome-列表">维护自己的 Awesome 列表</h4>
<p>如果你在 GitHub 为很多项目点亮过 Star,那么你很难找到你感兴趣的项目。这时候,最理想、最简单的方式就是,创建一个简单的 README 项目来放置自己感兴趣的内容。</p>
<p>它可以支持“云同步”、Diff 修改、PR,还可以骗来很多的 Star。</p>
<p>不过,我已经习惯使用我的 Ideas 来管理了~~。</p>
<h4 id="看微博员工发微博">看微博员工发微博</h4>
<p>微博上关注了几个新浪微博的员工,然后每天看他们发微博,要么吐槽“渣浪食堂”。</p>
<figure>
<img src="images/weibo.jpg" alt="微博食堂" /><figcaption>微博食堂</figcaption>
</figure>
<p>要么吐槽时间线。</p>
<p>这种人要是在阿里,那肯定是不正确的。</p>
<h4 id="将文章加入-todolist">将文章加入 TodoList</h4>
<p>如果你看到一些好的文章,那么你应该用一个 TodoList 工具:</p>
<p>这样你就不会看着不阅读了,同时享受划掉一个 Todo 的快感~。</p>
<p>看来你又有一些碎片化的时间,不妨分享到朋友圈,让大家关注一下,哈哈。</p>
<h1 id="练习的艺术">练习的艺术</h1>
<p>为了更好的练习,我们可以做一些事情来提高练习的意愿:</p>
<ul>
<li>创建 Ideas 列表</li>
<li>技术创新</li>
<li>实践</li>
</ul>
<h2 id="管理你的ideas">管理你的Ideas</h2>
<p>有一句话很有意思——我们就差一个写代码的了。但是,我们经常说的是我们缺少一个idea。过去我也一直觉得我缺少一些Idea,今天发现并非如此,我们只是缺少记录的手段。</p>
<p>大概是在七个前,有一天我在Github上闲逛的时候,找到了一个代码库,然后习惯性的点开了作者的Profile。发现了一个名为ideas的repo,尽管里面只有简简单单地几个idea。但是这让我发现了一个新的大陆,在那之前我一直用OneNote记录我的idea(用的是Nokia Lumia 1020)。</p>
<p>而打开OneNote记录Idea,并不是很方便,有时候是代码,有时候是一篇博客的链接,有时候只是一段话。而且Idea出现的时候往往是在浏览一些网站的时候,Mac OS上的OneNote与Windows Phone的同步又有问题。</p>
<p>紧接着,我开始用Github的README.md和Issues来管理我的idea:<a href="https://github.com/phodal/ideas" class="uri">https://github.com/phodal/ideas</a>。</p>
<h3 id="github管理idea">Github管理Idea</h3>
<p>半年时间过去了,我的Issues列表里已经关闭17个Issues,大部分是已经完成的idea。而在Open的列表里还有着12个还没开始、或者只进行了一部分的ideas。稍微看了一下,每个Idea大概隔了七天,毕竟是可遇不可求的。</p>
<p>如我最近解决的一个问题是——项目技术栈趋势图。而这个Idea从出现到实现只花了一天的时间,或者这算不上一个真正的Idea。而这个Idea则是依赖于另外一个Idea——技术树。同样的例子还会有很多,这和技术的演进是差不多的,Idea也是一点点演进出来的。</p>
<h4 id="issue">Issue</h4>
<p>Issues一直是一个神奇的存在,你可以用它当成博客,然后下面就可以有评论。Disqus也许可以和Github合作,这样他们就会有一个巨大的市场,当然这只会是一个玩笑。</p>
<p>Issues是一个非常不错的『工具』,因为它可以打上Tags,你就可以通过此为你不同的Idea进行一个分类。并且每每有一个idea完成的时候,就可以关闭这个Issue了。这就好像修复一个Bug的感觉。</p>
<p>对于每个Idea相关的一些内容,我们都可以以Comments的形式添加相应的内容。</p>
<h4 id="展示idea的readme">展示Idea的README</h4>
<p>README都会是一个项目的介绍,而且我们也可以在上面汇集我们的所有Idea。如在我的idea列表的README里已经有长长的一堆了。。</p>
<p>每个项目里,都会有一个简单的介绍,如EchoesWorks:</p>
<p>简介:Next-Generation Tech Blog/Presentation Framework</p>
<p>特性:</p>
<ul>
<li>支持 Markdown</li>
<li>Github代码显示</li>
<li>全屏背景图片</li>
<li>左/右侧图片支持</li>
<li>进度条</li>
<li>自动播放</li>
<li>字幕</li>
<li>分屏控制</li>
</ul>
<p>在一些项目里也会有一些长长的介绍,及截图。</p>
<h2 id="程序员如何批量生产idea">程序员如何批量生产idea</h2>
<p>作为一个程序员都有超越BIll Gates,又Linus Torvalds一样的梦想。当然也可能没有那么远大,但是也会有当上CTO这样的想法。</p>
<p>一直在考虑这样的问题很久,直到有一天有了一些新的想法——这也是可以练习的。我们都知道创业就是集齐一些条件,然后持之以恒地做下去。而要集齐条件是一件很难的事,但是要练习确是一件很容易的事。</p>
<p>如果你可以每天抽出时间做一件事,那么再好不过了。如果一直在加班,那么这件事对你来说一定是很困难的一件事。抽出这些时间,然后做一些有针对性地学习和练习,那么就会离这个目标又进一步。</p>
<p>所以,这其实是一篇在说怎么去练习创建一个成功的产品的文章。这些原则可以很容易运用到创建一些开源项目上,又或者是其他类似的事情。如果你看过之前那篇《程序员如何艺术的提升技术、影响力&赚钱》,那么我想这篇文章对于你去创建一个Side Project也是很有意思的。</p>
<h3 id="如何产生idea从只差程序员到不差idea">如何产生Idea:从「只差程序员」到「不差Idea」</h3>
<p>过去我也一想在想这个问题,为什么我也没有一个好的Idea。后来,我发现只是我没有去记录,再后来我发现光有一个好的Idea也没啥用。</p>
<h4 id="只差程序员">「只差程序员」</h4>
<p>「只差程序员」是一个很值得思考的问题,但是也是一个很有意思的问题。作为一个程序员,我们很容易发现对方的Idea,实现上真的不怎么样。而且如果他们差的不只是一个程序员,他们需要的是一系列的程序员。还有更多的人员,他们只是觉得程序员是万能的。</p>
<p>这就回到了一个问题上,既然我们是一个程序员,那么我们就占据着这个世界上的人和了。如果天时是一个好的时机的话,那么就是值得去等待了。但是作为地利的Idea,却是可以练习出来的。</p>
<p>这可能是你听过最有意思的笑话了<sub>~</sub>。</p>
<p>在我看对刻意地练习进行了一番尝试之后,我发现这其有无限的可能性。</p>
<h3 id="对创新的练习产生idea">对创新的练习:产生Idea</h3>
<p>开始瞎说之前,让我们先看看英特尔®高级院士Gene Meieran对创新的三种类型定义:</p>
<ul>
<li>突破性创新,其特征是打破陈规,改变传统和大步跃进;</li>
<li>渐进式创新,特征是采取下一逻辑步骤,让事物越来越美好;</li>
<li>再运用式创新,特征是采用横向思维,以全新的方式应用原有事物。</li>
</ul>
<p>现在,我们已经有三个可以练习的领域了。</p>
<p><strong>等等,我们从哪个领域开始?</strong></p>
<p>这是一个再简单不过地问题,自然是从我们擅长的领域开始——计算机。又好像是一个说了等于没说的答案,而这也是最容易练习的领域了。</p>
<p>在我们日常的编程工作中,我们会遇到各式各样的问题。有的人因此而创建了许多工具,有的人创建一些公司等等。只是因为这些是我们的痛点,而如果一个痛点是很多人的痛苦,那说明这是有希望的一个想法。因此,上面的三点也是三个可以练习的点。对于突破性创新来说,可能会比较难以在早期进行练习。但是对于渐进式创新来说,却是一件很容易的事。</p>
<p>创新是一个很有意思的话题,人们都在不断地鼓励创新。到底什么才算得上是创新?</p>
<p>作为一个企业想要有创新的目的莫过于:想活得更久。在多数的情况下,限制企业创新的主因便是企业本身的组织结构问题。如果一个在市场方面占有领先地方的公司做了很多创新,必然会更受尊重。Google在这方面做得不错,然而也饱受批评——毕竟,公司都是以营利为目的。如果一个产品本身达不到预期的营利要求,那么它必然会被关闭。</p>
<h4 id="渐近式创新减法">渐近式创新:减法</h4>
<p>在很早很早以前,我们都用过jQuery。然而这个库太大了,在早期他根本就不适合用于移动领域。相信当时也有相当多的人对其叫苦连天,于是有一个人写了一个框架叫Zepto——一个兼容jQuery API的迷你版jQuery。</p>
<p>去除掉那些我们不需要的功能,我们就可以获得一个新的产品。毕竟,每个人的口味都是不同的。功能越多的东西并不意味着越好,好的设计应该是添加不了新的特性,也删除不了特性。</p>
<p>兼容旧的浏览器本身就不是一件令人愉快的事,如果我们可以像React一样抛弃旧有的浏览器,那么我们在开始的时候就能走得更快。</p>
<h4 id="再运用式创新">再运用式创新</h4>
<p>对于这一个点就更有意思了。就是找以前的人做过的Idea,重新做一遍。在旧有的技术下不能完成的Idea,在新的技术和环境下就有可能完成了。如出生得太早的Palm掌上电脑,如果在一个新的时机重新创造的话,那么我们就可以超越原来的产品</p>
<p>实现上,你也发现了上面我们说了一堆费话。因为没有行动的话,说太多也是没用的。</p>
<p>记得我们的上上次Hack Day的主题是慈善,我们想做一个O2O捐赠(ps: 当然这个项目是开源的,代码放在GitHub上:<a href="https://github.com/icharity" class="uri">https://github.com/icharity</a>)。对于我来说,这是一次彻底的自由技术选型。</p>
<p>我们平时的主要语言是Java、Ruby、JavaScript,我们还使用了个古董级别的搜索引擎。尽管应用现有的系统架构可以完成我们的功能——搜索引擎保存、搜索数据,用Java语言来实现业务代码。但是在这样一个“伟大的节日”,我们还是自由地去创新。</p>
<p>于是,我使用了Django作为主要框架,ElasticSearch作为数据持久化,使用Node-Wechat来处理用户输入。接着在这三天里,就Happy的去写代码了。Blabla,然后就可以欢快地和人们去ShowCase了。</p>
<p>而这便是一个很好的再运用式创新,而这也是一个很通俗的例子。现在我已经想到了一个更简单的例子了:以前当我们不懂得设计模式的时候,我们写的代码可能看上去可以重构,但是又找不到一个好的点。而有了设计模式之后,我们便可以在我们学到的新思维用到旧有的代码里。</p>
<p>对于上面的例子来说也是相似的,我们已经有了旧有的技术模式,只是现在我们有了新的业务。新的业务可以匹配到我们旧有的技术框架里,旧的技术框架可以得到复用。</p>
<h4 id="渐进式创新">渐进式创新</h4>
<p>渐进式创新是一件很有意思的事,他已经和我们上面提到的“减法”相矛盾了。但是这一点似乎就是很多软件的盈利点所在——通过添加新的功能来赚钱。这也是一个非常容易理解的点,你只需要添加一些新的特性即可。不过,我想这一点已经到处都用到了,没啥说的~~。</p>
<p>在一次Hackday里,我们(我当时是实时生,只是在打酱油~~)用WebRTC、Arduino、Android手机、四轮小车作了一个小机器人。我们搭建了一个WebRTC的Server,手机与四轴小车做了一个漫游者,然后你可以在网页上看到小车看到的东西,并且你还可以在通过WebSocket在网页上操作他。</p>
<p>而我们的新Idea,便是用Oculus替换掉浏览器——我们可以用Oculus来观看远程的画面,当然还应该可以移动。尽管改变看上去很少,但是还是充满了技术挑战。</p>
<p>而这也是多数产品的一种路线,而这是这种路线让一个又一个的程序员加班。因为Idea本身不一定可靠,没有人能保证他们的想法一定可行。但是如果程序员不是那个出Idea的人,那么就只能任人宰割了。渐进式创新是很保守的技术创新,在现有的产品的基础上加以改进——算是加法创新。</p>
<h3 id="开始记录你的问题idea">开始记录你的问题/Idea</h3>
<p>记得在那篇《<a href="https://www.phodal.com/blog/use-github-manage-idea/">如何去管理你的Idea</a>》中,我们提到了用GitHub来管理Idea的想法。但是在上面记录的都是一些公开式的Idea,我们可以记录一些相似的问题。除此,我们还有一些更好的工具。</p>
<p><strong>但是,养成记录问题和Idea的习惯很重要。</strong> <strong>但是,养成记录问题和Idea的习惯很重要。</strong> <strong>但是,养成记录问题和Idea的习惯很重要。</strong></p>
<p>如我开始将各式各样的Idea,向我的<a href="http://github.com/phodal/ideas">GitHub Repo</a>里放,如下图所示:</p>
<figure>
<img src="images/github-issues.jpg" alt="GitHub Issues" /><figcaption>GitHub Issues</figcaption>
</figure>
<p>里面已经堆了一堆想法,有的是重复的造轮子,有的是造一些新的轮子。隔三差五地创建一个新的Issue,虽然不一定及时完成,但是可以放着看看。等老了,看看有哪些Idea已经被实现了。</p>
<p>除此,有一些比较隐私地Idea,会用【奇妙清单】来管理:</p>
<figure>
<img src="images/wunderlist.jpg" alt="奇妙清单" /><figcaption>奇妙清单</figcaption>
</figure>
<p>想法先记下来,然后再说~~。</p>
<h2 id="造轮子">造轮子</h2>
<p>造轮子是一种快速的学习方式,而还有一种进阶则可以是从Github中生成轮子。</p>
<h3 id="从github生成轮子">从GitHub生成轮子</h3>
<p>使用GitHub来生成轮子,简单来说就是:</p>
<ol type="1">
<li><p>查看很多Github项目的源码及提交历史</p></li>
<li><p>写胶水代码生成自己的框架</p></li>
</ol>
<p>在这里分享之前造的几个轮子的过程:</p>
<h4 id="spa框架">SPA框架</h4>
<p>两年多以前,当时我们项目用的技术栈是:<strong>Backbone</strong> + <strong>Mustache</strong> + <strong>jQuery。</strong>在我们当时的环境下,主要组成有:</p>
<ol type="1">
<li>Backbone提供了一个Router<br />
</li>
<li>Mustache提供了模板<br />
</li>
<li>jQuery抽象了DOM<br />
</li>
<li>Ajax请求</li>
</ol>
<p>所以,这就是我造的第一个轮子的重要组成部分。</p>
<p>接着,我就开始造轮子了:我称呼这个框架为Lettuce, <a href="//link.zhihu.com/?target=https%3A//github.com/phodal/lettuce">GitHub - phodal/lettuce: Mobile Framework for Romantic. 简约的移动开发框架</a>。</p>
<p>我参考了一本名为《Building A JavaScript Framework 》的电子书,以及《JavaScript框架设计》一书。因为没有任何框架的设计经验,所以只好试图按照书上的一点一滴来进行。在这个过程中,我开始深入JavaScript。</p>
<p>从 [https://github.com/munro/self) 这个库中,我开始创建了自己的类的用法。</p>
<p>接着,开始写Ajax,照例还是参考了jQuery和Zepto的代码。同样的还有Event、Promise等等的一些类。</p>
<p>然后就是Router,源码来自于:https://krasimirtsonev.com/blog/article/A-modern-JavaScript-router-in-100-lines-history-api-pushState-hash-url,又参考了早期的Backbone代码。</p>
<p>以及模板引擎,照例代码也不全是我写的,用的是http:////ejohn.org/blog/javascript-micro-templating/</p>
<p>最后就是一个简单的PageView:</p>
<div class="sourceCode"><pre class="sourceCode javascript"><code class="sourceCode javascript"> <span class="kw">var</span> SimpleView <span class="op">=</span> <span class="kw">new</span> <span class="va">Lettuce</span>.<span class="va">prototype</span>.<span class="at">Class</span>(<span class="op">{}</span>)<span class="op">;</span>
<span class="va">SimpleView</span>.<span class="va">prototype</span>.<span class="at">init</span> <span class="op">=</span> <span class="kw">function</span> () <span class="op">{};</span>
<span class="va">SimpleView</span>.<span class="va">prototype</span>.<span class="at">render</span> <span class="op">=</span> <span class="kw">function</span> (template<span class="op">,</span> elementId) <span class="op">{</span>
<span class="va">document</span>.<span class="at">getElementById</span>(elementId).<span class="at">innerHTML</span> <span class="op">=</span> template<span class="op">;</span>
<span class="op">};</span>
<span class="kw">var</span> simpleView <span class="op">=</span> <span class="op">{</span>
<span class="dt">SimpleView</span><span class="op">:</span> SimpleView
<span class="op">};</span>
<span class="va">Lettuce</span>.<span class="at">prototype</span> <span class="op">=</span> <span class="va">Lettuce</span>.<span class="at">extend</span>(<span class="va">Lettuce</span>.<span class="at">prototype</span><span class="op">,</span> simpleView)<span class="op">;</span></code></pre></div>
<p>这其中最复杂的部分就是结合别人的代码,换句话来说,就是<strong>写胶水代码</strong>。Blabla,最后我就有了一个SPA框架。</p>
<p>相关文章:<a href="https://www.phodal.com/blog/build-javascript-framework-init-project/">一步步搭建JavaScript框架——初始化项目</a></p>
<p><strong>不过,这其中参考了几十个框架,这点对提升自己很重要。</strong></p>
<h4 id="slide框架">Slide框架</h4>
<p>八个多月前,当时的情形是我需要有一个可以定时放映地Slide框架,而当时大部分的框架都不能满足我的要求。</p>
<p>实际上我只需要一个定时的功能,而Impress的最新代码又太复杂了。</p>
<p>接着,我看了Github上的提交历史,我发现挺简单的,就自己创一个新的框架,称为<a href="https://github.com/phodal/echoesworks">GitHub - phodal/echoesworks: Next-Generation Tech Blog/Presentation/Slider Framework</a>。</p>
<p>我需要下面的一些元素:</p>
<ol type="1">
<li>Markdown解析器<br />
</li>
<li>Slide框架<br />
</li>
<li>Github代码显示<br />
</li>
<li>进度条</li>
</ol>
<p>同样的,我在Github上搜索不同的组件,最后再把他们结合到一起。</p>
<p>相关文章:</p>
<ol type="1">
<li><a href="https://www.phodal.com/blog/build-echoesworks/">EchoesWorks —— 打造下一代技术Blog/Presentation 框架</a><br />
</li>
<li><a href="https://www.phodal.com/blog/build-echoesworks-use-localstorage-commucation-in-tab/">EchoesWorks构建: LocalStorage与跨Tab通信</a></li>
</ol>
<p>接着,我又造了不同的几个框架:</p>
<ol type="1">
<li><a href="https://github.com/phodal-archive/geng">GitHub - phodal-archive/geng: DSL Step 1 —— Parse: 天干物燥,小心火烛</a><br />
</li>
<li><a href="https://github.com/phodal-archive/tile.js">GitHub - phodal-archive/tile.js: a pure javascript tiled map render</a><br />
</li>
<li><a href="https://github.com/phodal/resume">GitHub - phodal/resume: RESUME Generator</a></li>
</ol>
<p>随着造的轮子越来越多,写胶水代码的能力越来越强,我就开始创造一些更有意思的轮子。</p>
<h4 id="三luffa">三、Luffa</h4>
<p>Luffa是最近造的一个轮子,对于不写测试的人来说可能没有那么有意思。</p>
<p>我称其为基于Virtual DOM与Diff DOM的测试代码生成,<a href="//link.zhihu.com/?target=https%3A//github.com/phodal/luffa">GitHub - phodal/luffa: A Test Framework Helper for Fun</a></p>
<p>当时我们项目用的是Jasmine和Jasmine jQuery作为测试框架。在写测试的时候,觉得看起来太麻烦了,就想着写一个框架来Diff DOM的变化。</p>
<p>然后就是Virtual DOM那些东西了。</p>
<p>virtual-dom可以说由下面几部分组成的:</p>
<ol type="1">
<li>createElement,用于创建virtual Node。</li>
<li>diff,顾名思义,diff算法。</li>
<li>h,用于创建虚拟树的DSL——HyperScript。HyperScript是一个JavaScript的HyperText。</li>
<li>patch,用于patch修改的内容。</li>
</ol>
<p>所以,我们可以很容易地创建出一个这样的框架来Diff测试中DOM元素的修改。</p>
<blockquote>
<p>EchoWorks</p>
</blockquote>
<h1 id="创建自己的产品">创建自己的产品</h1>
<p>创业练习</p>
<h3 id="growth-应用">Growth 应用</h3>
<h1 id="专业">专业</h1>
<h2 id="测试">测试</h2>
<h2 id="代码质量">代码质量</h2>
<h1 id="三年职业编程生涯里遇到的那些挑战">三年职业编程生涯里,遇到的那些挑战</h1>
<blockquote>
<p>常听人说,在我司待上三年,你就该“毕业”了。</p>
</blockquote>
<p>说工作多少年总是有种秀资历的感觉,一点儿也不好,下次让我们换个口味:你的年假有多少天。</p>
<p>简单的来一下流水线:</p>
<ul>
<li>2013 年 12 月 30 日,开始在现在的公司实习——从一个电焊工变成了一个键盘侠。</li>
<li>2014 年 12 月 30 日,期间挖了一个大 Bug 导致下线。</li>
<li>2015 年 12 月 30 日,和我们家 <span class="citation" data-cites="花仲马">@花仲马</span> 手牵着手下班。</li>
<li>2016 年 12 月 30 日,交付了第二本书,它总结了这三年(快把买书的钱准备好)。</li>
</ul>
<p>2016 的最后一批狗粮如预期一样,已经发放完了,请期待 2017 年的狗粮。</p>
<p>是时候进入正题了。</p>
<h2 id="实习同侪压力">实习:同侪压力</h2>
<p>实习的时候的主要压力源是:同侪压力(或称同辈压力、朋辈压力,指的是同侪施加的的一种影响力,它可以鼓励一个人为了遵守团体社会规范而改变其态度、价值观、行为。)。同时进公司的同事大部分都是重点学校的研究生。这种事情落在一个二流学校的本科生身上,就是一种压力——和他们相比,你不知道究竟差了多少。即使是相差无已的,你也会觉得他们比你强。概况我又不是计算机专业的,而在大学之前我一直在为成为 Kernel Hacker 而努力着。</p>
<p>这种压力倒算是正向的,在为更强大的自己为努力着。然后,你就 Move Fast,也不得不 Move Fast。生怕有一天,你就落后于其他人。后来你就知道了,我开始刷 GitHub 来提高经验值、开始刷书提高理论值。那时还有一个时间段,我以每天一篇的文章在刷博客。</p>
<p>等毕业的时候,因为更具有挑战性,便想去尝试国内交付。通过 PM、Buddy、Sponsor 等去与上级讨论,遗憾的是都没有这样的机会。毕竟这些机会都是有限的,哪天已经长成的时候,它就会来找你,而你已经不想要了。</p>
<p>这段时间倒也成了成长最快的时候,没有工作上的压力,还有人指导你成长,还能在项目实战上成长。</p>
<h2 id="初入职场interview-和-coaching-新人">初入职场:Interview ++ 和 Coaching 新人</h2>
<p>开始正式工作之后,就进入了半年的试用期。虽然并不会因为有半年的适用期而影响,但是项目还是一个项目,多少就会变得有点无聊。</p>
<p>这时候的挑战变成了:Interview ++ 和 Coaching 新人。</p>
<p>度过试用期的标准是:愿意不愿意和 Ta 一起工作。但是当你在试用期的时候,就会遇到每个月的一次 Interview++。项目上的其他成员(已经过试用期)会对你进行一次组内考核,这种反馈是多方面的——不限于技术。如我在最初的时候,遇到的主要问题就是说话语速过快、普通话发音和英语问题。</p>
<p>后来,<strong>语速大家习惯了</strong>,<strong>胡建话大家也习惯了</strong>,<strong>英语提高了一点,大家也习惯了</strong>。再后来,我就去翻译书,还能愉快地用英语培训客户。</p>
<p>当你好不容易解决了一个反馈的时候,在下一次 Interview++ 的时候,你就会收到一个新的反馈,然后好好改正吧!少年。你就会一直在变得更好的路上,同时更加累。</p>
<p>入职的三星期后,七个人的团队里有四个新人(包括我)。由于我们采用结对编程的方式工作,这就不得不和其他新人结对,去 Coaching 新人。这种体验一点儿也不好,每天你都要提前做好准备,还有会遇到你的 Pair 问的各种问题。</p>
<p>在你也不是很熟悉快捷键的时候,还需要去教会你的 Pair 使用快捷键,你就不得不加倍去练习这些技能。当然这种成长也会更快、更累,顺便带你的小伙伴一起飞。</p>
<h2 id="第二年be-profressional">第二年:Be Profressional</h2>
<p>当然,事情并没有这样一帆风顺。有一次,写了一个大 Bug 进去,然后上线又下线了。因为采用的是一个迭代上线一次,所以事情不算太糟糕,就是回滚到上一个迭代的版本。</p>
<p>这个 Bug 起先是为了 SEO(搜索引擎优化),他成功的跳过了:需要运行一小时的功能测试、数量众多的功能测试、QA 们的测试,最后是由 Google Analytics 发现了这个 Bug。同时他也困扰了我一段时间,那是我在当时找到的方法,然后也没看出大问题,就愉快地修改了。对于这个十年左右的代码库,我终究还是太年轻了。</p>
<p>现在,这些代码仍然在线上运行着。不过,据说已经没人会去修改这些代码了。</p>
<p>团队里的大部分人都是从 TWU 里出来的,同时采用了标准的结对编程流程,因此我们一直自豪的宣称:中国区对文化和敏捷遵循最好的团队。可惜,现在已经不存在了。</p>
<p>我们遵循着制定下的一个个软件实践:保持提交信息一致,保持持续集成的最高可用性等等。当你的持续集成是红的时候,就会有人愉快地去帮你查看失败的原因,诸如 Check Style 失败的、红过夜的是要买酸奶的。不及时修复的、修复难度比较大的,会立马被 Revert。</p>
<p>当你犯错的时候,记得:<strong>Be Profressional</strong>!</p>
<p>后来,在工作上的挑战也就越来越少了。</p>
<h2 id="第三年lucky-unlucky">第三年:Lucky & Unlucky</h2>
<p>有的人可以在三年里经历一系列的项目,刷下一堆经验值。有的人可以在三年里经历一个项目,留下一段篇章。</p>
<p>记得,在公司法中说:公司是指一般依法设立的,有独立的法人财产,以<strong>营利为目的的</strong>企业法人。当你工作的时候,一切都需要以营利为目的。如果公司营利多了,那么什么都好说。反之,你懂的。因此无论在哪,领导层都以公司的营利为核心。随后,才是公司文化,才是你的个人利益。再好的文化也会有变的一天,只有“利益是永恒”的。</p>
<p>因此,只要你把工作当成工作,公司当成公司,就会发现一切都很轻松。毕竟,<strong>技术好</strong>本身是没有价值的,有价值的是技术做好的事。</p>
<p>三年里只经历了两个项目,即算是一种不幸,也是一种幸运。不幸的是,从工作上能学习到的东西少之又少。幸运的是,可以有大量的时间去刷 GitHub、写博客、翻译书。</p>
<p>在这个时候,你总得去寻找你的下一个挑战点在哪。</p>
<p>我在寻找下一个挑战点,你呢??</p>
<h1 id="程序员你真的清楚你遇到的问题吗">程序员,你真的清楚你遇到的问题吗?</h1>
<blockquote>
<p>作为一枚程序员,我们天生就是来解决问题的。在你不知道你的问题之前,我帮不了你,Google 也不能帮你解决问题。</p>
</blockquote>
<p>大概从去年开始吧,我在思考着提升软技能上的能力。对于问题来说,能力可以分为这么几种:</p>
<ul>
<li>如何识别出问题的关键所在?分析能力</li>
<li>如何表述清楚问题?提高表达能力</li>
<li>能否以更清楚的形式来表达问题?如使用故事的手法?</li>
<li>如何来指导他人解决问题?Coach</li>
</ul>
<p>那么问题来了,当别人问你一个问题的时候,你会怎么去分析它呢?首先要对这个问题进行分类,因为<strong>很多问题是无解的</strong>。比如说,初学者问你:</p>
<ul>
<li>如何在 24 小时内成为前端工程师?</li>
<li>我已经 30 岁了,应该不应该转行当程序员?</li>
<li>大三法学生应不应该为了转行(web前端开发)而放弃司法考试?</li>
</ul>
<p>很多时候,你只想要别人的肯定而已。</p>
<h2 id="问题来源的分类">问题来源的分类</h2>
<p>作为成长的一个方向,我开始去寻找一些咨询类的书籍,才了解咨询师可以分为好多种。比如说: 技术、解决方案咨询。我们需要有人来解决某个特定的问题,这个的问题是:已知的问题,但是找不到合适的解决方案。</p>
<p>常见的比如说,你需要一个团队转型方案,你需要有经验的人来帮你,以期降低相应的风险指数。</p>
<p>又比如说,我们知道我们遇到了问题,但是我们不清楚问题出自哪里。</p>
<p>还有一些就是,我们不知道我们不知道,我们想预测一下『黑天鹅』。</p>
<p>简单的来说,就是『约哈里之窗』。</p>
<p>最后,还有一种情况是:出于政治目的,我们需要你来证明 B 方案是比 A 方案更好的。事实上,这种问题在我们的生活中更常见。我在心里已经有了答案了,我咨询你只是为了得到一个肯定,然后就可以实施这个方案。即使,你不肯定这个方案,我也会实施的——这就是『灰犀牛』,<strong>我们早就看到却又视而不见的危险</strong>。</p>
<p>(PS:不可预测的黑天鹅,可预测、可感知、可预防的灰犀牛,他们都是两种奇葩。)</p>
<p>也因此,很多时候,被提问的你就是那个背锅的大头。</p>
<h2 id="如何去解决问题">如何去解决问题</h2>
<blockquote>
<p>一旦一个问题被充分地描述了他的细节,那么解决方法也是显而易见的。</p>