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
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015
1016
1017
1018
1019
1020
1021
1022
1023
1024
1025
1026
1027
1028
1029
1030
1031
1032
1033
1034
1035
1036
1037
1038
1039
1040
1041
1042
1043
1044
1045
1046
1047
1048
1049
1050
1051
1052
1053
1054
1055
1056
1057
1058
1059
1060
1061
1062
1063
1064
1065
1066
1067
1068
1069
1070
1071
1072
1073
1074
1075
1076
1077
1078
1079
1080
1081
1082
1083
1084
1085
1086
1087
1088
1089
1090
1091
1092
1093
1094
1095
1096
1097
1098
1099
1100
1101
1102
1103
1104
1105
1106
1107
1108
1109
1110
1111
1112
1113
1114
1115
1116
1117
1118
1119
1120
1121
1122
1123
1124
1125
1126
1127
1128
1129
1130
1131
1132
1133
1134
1135
1136
1137
1138
1139
1140
1141
1142
1143
1144
1145
1146
1147
1148
1149
1150
1151
1152
1153
1154
1155
1156
1157
1158
1159
1160
1161
1162
1163
1164
1165
1166
1167
1168
1169
1170
1171
1172
1173
1174
1175
1176
1177
1178
1179
1180
1181
1182
1183
1184
1185
1186
1187
1188
1189
1190
1191
1192
1193
1194
1195
1196
1197
1198
1199
1200
1201
1202
1203
1204
1205
1206
1207
1208
1209
1210
1211
1212
1213
1214
1215
1216
1217
1218
1219
1220
1221
1222
1223
1224
1225
1226
1227
1228
1229
1230
1231
1232
1233
1234
1235
1236
1237
1238
1239
1240
1241
1242
1243
1244
1245
1246
1247
1248
1249
1250
1251
1252
1253
1254
1255
1256
1257
1258
1259
1260
1261
1262
1263
1264
1265
1266
1267
1268
1269
1270
1271
1272
1273
1274
1275
1276
1277
1278
1279
1280
1281
1282
1283
1284
1285
1286
1287
1288
1289
1290
1291
1292
1293
1294
1295
1296
1297
1298
1299
1300
1301
1302
1303
1304
1305
1306
1307
1308
1309
1310
1311
1312
1313
1314
1315
1316
1317
1318
1319
1320
1321
1322
1323
1324
1325
1326
1327
1328
1329
1330
1331
1332
1333
1334
1335
1336
1337
1338
1339
1340
1341
1342
1343
1344
1345
1346
1347
1348
1349
1350
1351
1352
1353
1354
1355
1356
1357
1358
1359
1360
1361
1362
1363
1364
1365
1366
1367
1368
1369
1370
1371
1372
1373
1374
1375
1376
1377
1378
1379
1380
1381
1382
1383
1384
1385
1386
1387
1388
1389
1390
1391
1392
1393
1394
1395
1396
1397
1398
1399
1400
1401
1402
1403
1404
1405
1406
1407
1408
1409
1410
1411
1412
1413
1414
1415
1416
1417
1418
1419
1420
1421
1422
1423
1424
1425
1426
1427
1428
1429
1430
1431
1432
1433
1434
1435
1436
1437
1438
1439
1440
1441
1442
1443
1444
1445
1446
1447
1448
1449
1450
1451
1452
1453
1454
1455
1456
1457
1458
1459
1460
1461
1462
1463
1464
1465
1466
1467
1468
1469
1470
1471
1472
1473
1474
1475
1476
1477
1478
1479
1480
1481
1482
1483
1484
1485
1486
1487
1488
1489
1490
1491
1492
1493
1494
1495
1496
1497
1498
1499
1500
1501
1502
1503
1504
1505
1506
1507
1508
1509
1510
1511
1512
1513
1514
1515
1516
1517
1518
1519
1520
1521
1522
1523
1524
1525
1526
1527
1528
1529
1530
1531
1532
1533
1534
1535
1536
1537
1538
1539
1540
1541
1542
1543
1544
1545
1546
1547
1548
1549
1550
1551
1552
1553
1554
1555
1556
1557
1558
1559
1560
1561
1562
1563
1564
1565
1566
1567
1568
1569
1570
1571
1572
1573
1574
1575
1576
1577
1578
1579
1580
1581
1582
1583
1584
1585
1586
1587
1588
1589
1590
1591
1592
1593
1594
1595
1596
1597
1598
1599
1600
1601
1602
1603
1604
1605
1606
1607
1608
1609
1610
1611
1612
1613
1614
1615
1616
1617
1618
1619
1620
1621
1622
1623
1624
1625
1626
1627
1628
1629
1630
1631
1632
1633
1634
1635
1636
1637
1638
1639
1640
1641
1642
1643
1644
1645
1646
1647
1648
1649
1650
1651
1652
1653
1654
1655
1656
1657
1658
1659
1660
1661
1662
1663
1664
1665
1666
1667
1668
1669
1670
1671
1672
1673
1674
1675
1676
1677
1678
1679
1680
1681
1682
1683
1684
1685
1686
1687
1688
1689
1690
1691
1692
1693
1694
1695
1696
1697
1698
1699
1700
1701
1702
1703
1704
1705
1706
1707
1708
1709
1710
1711
1712
1713
1714
1715
1716
1717
1718
1719
1720
1721
1722
1723
1724
1725
1726
1727
1728
1729
1730
1731
1732
1733
1734
1735
1736
1737
1738
1739
1740
1741
1742
1743
1744
1745
1746
1747
1748
1749
1750
1751
1752
1753
1754
1755
1756
1757
1758
1759
1760
1761
1762
1763
1764
1765
1766
1767
1768
1769
1770
1771
1772
1773
1774
1775
1776
1777
1778
1779
1780
1781
1782
1783
1784
1785
1786
1787
1788
1789
1790
1791
1792
1793
1794
1795
1796
1797
1798
1799
1800
1801
1802
1803
1804
1805
1806
1807
1808
1809
1810
1811
1812
1813
1814
1815
1816
1817
1818
1819
1820
1821
1822
1823
1824
1825
1826
1827
1828
1829
1830
1831
1832
1833
1834
1835
1836
1837
1838
1839
1840
1841
1842
1843
1844
1845
1846
1847
1848
1849
1850
1851
1852
1853
1854
1855
1856
1857
1858
1859
1860
1861
1862
1863
1864
1865
1866
1867
1868
1869
1870
1871
1872
1873
1874
1875
1876
1877
1878
1879
1880
1881
1882
1883
1884
1885
1886
1887
1888
1889
1890
1891
1892
1893
1894
1895
1896
1897
1898
1899
1900
1901
1902
1903
1904
1905
1906
1907
1908
1909
1910
1911
1912
1913
1914
1915
1916
1917
1918
1919
1920
1921
1922
1923
1924
1925
1926
1927
1928
1929
1930
1931
1932
1933
1934
1935
1936
1937
1938
1939
1940
1941
1942
1943
1944
1945
1946
1947
1948
1949
1950
1951
1952
1953
1954
1955
1956
1957
1958
1959
1960
1961
1962
1963
1964
1965
1966
1967
1968
1969
1970
1971
1972
1973
1974
1975
1976
1977
1978
1979
1980
1981
1982
1983
1984
1985
1986
1987
1988
1989
1990
1991
1992
1993
1994
1995
1996
1997
1998
1999
2000
2001
2002
2003
2004
2005
2006
2007
2008
2009
2010
2011
2012
2013
2014
2015
2016
2017
2018
2019
2020
2021
2022
2023
2024
2025
2026
2027
2028
2029
2030
2031
2032
2033
2034
2035
2036
2037
2038
2039
2040
2041
2042
2043
2044
2045
2046
2047
2048
2049
2050
2051
2052
2053
2054
2055
2056
2057
2058
2059
2060
2061
2062
2063
2064
2065
2066
2067
2068
2069
2070
2071
2072
2073
2074
2075
2076
2077
2078
2079
2080
2081
2082
2083
2084
2085
2086
2087
2088
2089
2090
2091
2092
2093
2094
2095
2096
2097
2098
2099
2100
2101
2102
2103
2104
2105
2106
2107
2108
2109
2110
2111
2112
2113
2114
2115
2116
2117
2118
2119
2120
2121
2122
2123
2124
2125
2126
2127
2128
2129
2130
2131
2132
2133
2134
2135
2136
2137
2138
2139
2140
2141
2142
2143
2144
2145
2146
2147
2148
2149
2150
2151
2152
2153
2154
2155
2156
2157
2158
2159
2160
2161
2162
2163
2164
2165
2166
2167
2168
2169
2170
2171
2172
2173
2174
2175
2176
2177
2178
2179
2180
2181
2182
2183
2184
2185
2186
2187
2188
2189
2190
2191
2192
2193
2194
2195
2196
2197
2198
2199
2200
2201
2202
2203
2204
2205
2206
2207
2208
2209
2210
2211
2212
2213
2214
2215
2216
2217
2218
2219
2220
2221
2222
2223
2224
2225
2226
2227
2228
2229
2230
2231
2232
2233
2234
2235
2236
2237
2238
2239
2240
2241
2242
2243
2244
2245
2246
2247
2248
2249
2250
2251
2252
2253
2254
2255
2256
2257
2258
2259
2260
2261
2262
2263
2264
2265
2266
2267
2268
2269
2270
2271
2272
2273
2274
2275
2276
2277
2278
2279
2280
2281
2282
2283
2284
2285
2286
2287
2288
2289
2290
2291
2292
2293
2294
2295
2296
2297
2298
2299
2300
2301
2302
2303
2304
2305
2306
2307
2308
2309
2310
2311
2312
2313
2314
2315
2316
2317
2318
2319
2320
2321
2322
2323
2324
2325
2326
2327
2328
2329
2330
2331
2332
2333
2334
2335
2336
2337
2338
2339
2340
2341
2342
2343
2344
2345
2346
2347
2348
2349
2350
2351
2352
2353
2354
2355
2356
2357
2358
2359
2360
2361
2362
2363
2364
2365
2366
2367
2368
2369
2370
2371
2372
2373
2374
2375
2376
2377
2378
2379
2380
2381
2382
2383
2384
2385
2386
2387
2388
2389
2390
2391
2392
2393
2394
2395
2396
2397
2398
2399
2400
2401
2402
2403
2404
2405
2406
2407
2408
2409
2410
2411
2412
2413
2414
2415
2416
2417
2418
2419
2420
2421
2422
2423
2424
2425
2426
2427
2428
2429
2430
2431
2432
2433
2434
2435
2436
2437
2438
2439
2440
2441
2442
2443
2444
2445
2446
2447
2448
2449
2450
2451
2452
2453
2454
2455
2456
2457
2458
2459
2460
2461
2462
2463
2464
2465
2466
2467
2468
2469
2470
2471
2472
2473
2474
2475
2476
2477
2478
2479
2480
2481
2482
2483
2484
2485
2486
2487
2488
2489
2490
2491
2492
2493
2494
2495
2496
2497
2498
2499
2500
2501
2502
2503
2504
2505
2506
2507
2508
2509
2510
2511
2512
2513
2514
2515
2516
2517
2518
2519
2520
2521
2522
2523
2524
2525
2526
2527
2528
2529
2530
2531
2532
2533
2534
2535
2536
2537
2538
2539
2540
2541
2542
2543
2544
2545
2546
2547
2548
2549
2550
2551
2552
2553
2554
2555
2556
2557
2558
2559
2560
2561
2562
2563
2564
2565
2566
2567
2568
2569
2570
2571
2572
2573
2574
2575
2576
2577
2578
2579
2580
2581
2582
2583
2584
2585
2586
2587
2588
2589
2590
2591
2592
2593
2594
2595
2596
2597
2598
2599
2600
2601
2602
2603
2604
2605
2606
2607
2608
2609
2610
2611
2612
2613
2614
2615
2616
2617
2618
2619
2620
2621
2622
2623
2624
2625
2626
2627
2628
2629
2630
2631
2632
2633
2634
2635
2636
2637
2638
2639
2640
2641
2642
2643
2644
2645
2646
2647
2648
2649
2650
2651
2652
2653
2654
2655
2656
2657
2658
2659
2660
2661
2662
2663
2664
2665
2666
2667
2668
2669
2670
2671
2672
2673
2674
2675
2676
2677
2678
2679
2680
2681
2682
2683
2684
2685
2686
2687
2688
2689
2690
2691
2692
2693
2694
2695
2696
2697
2698
2699
2700
2701
2702
2703
2704
2705
2706
2707
2708
2709
2710
2711
2712
2713
2714
2715
2716
2717
2718
2719
2720
2721
2722
2723
2724
2725
2726
2727
2728
2729
2730
2731
2732
2733
2734
2735
2736
2737
2738
2739
2740
2741
2742
2743
2744
2745
2746
2747
2748
2749
2750
2751
2752
2753
2754
2755
2756
2757
2758
2759
2760
2761
2762
2763
2764
2765
2766
2767
2768
2769
2770
2771
2772
2773
2774
2775
2776
2777
2778
2779
2780
2781
2782
2783
2784
2785
2786
2787
2788
2789
2790
2791
2792
2793
2794
2795
2796
2797
2798
2799
2800
2801
2802
2803
2804
2805
2806
2807
2808
2809
2810
2811
2812
2813
2814
2815
2816
2817
2818
2819
2820
2821
2822
2823
2824
2825
2826
2827
2828
2829
2830
2831
2832
2833
2834
2835
2836
2837
2838
2839
2840
2841
2842
2843
2844
2845
2846
2847
2848
2849
2850
2851
2852
2853
2854
2855
2856
2857
2858
2859
2860
2861
2862
2863
2864
2865
2866
2867
2868
2869
2870
2871
2872
2873
2874
2875
2876
2877
2878
2879
2880
2881
2882
2883
2884
2885
2886
2887
2888
2889
2890
2891
2892
2893
2894
2895
2896
2897
2898
2899
2900
2901
2902
2903
2904
2905
2906
2907
2908
2909
2910
2911
2912
2913
2914
2915
2916
2917
2918
2919
2920
2921
2922
2923
2924
2925
2926
2927
2928
2929
2930
2931
2932
2933
2934
2935
2936
2937
2938
2939
2940
2941
2942
2943
2944
2945
2946
2947
2948
2949
2950
2951
2952
2953
2954
2955
2956
2957
2958
2959
2960
2961
2962
2963
2964
2965
2966
2967
2968
2969
2970
2971
2972
2973
2974
2975
2976
2977
2978
2979
2980
2981
2982
2983
2984
2985
2986
2987
2988
2989
2990
2991
2992
2993
2994
2995
2996
2997
2998
2999
3000
3001
3002
3003
3004
3005
3006
3007
3008
3009
3010
3011
3012
3013
3014
3015
3016
3017
3018
3019
3020
3021
3022
3023
3024
3025
3026
3027
3028
3029
3030
3031
3032
3033
3034
3035
3036
3037
3038
3039
3040
3041
3042
3043
3044
3045
3046
3047
3048
3049
3050
3051
3052
3053
3054
3055
3056
3057
3058
3059
3060
3061
3062
3063
3064
3065
3066
3067
3068
3069
3070
3071
3072
3073
3074
3075
3076
3077
3078
3079
3080
3081
3082
3083
3084
3085
3086
3087
3088
3089
3090
3091
3092
3093
3094
3095
3096
3097
3098
3099
3100
3101
3102
3103
3104
3105
3106
3107
3108
3109
3110
3111
3112
3113
3114
3115
3116
3117
3118
3119
3120
3121
3122
3123
3124
3125
3126
3127
3128
3129
3130
3131
3132
3133
3134
3135
3136
3137
3138
3139
3140
3141
3142
3143
3144
3145
3146
3147
3148
3149
3150
3151
3152
3153
3154
3155
3156
3157
3158
3159
3160
3161
3162
3163
3164
3165
3166
3167
3168
3169
3170
3171
3172
3173
3174
3175
3176
3177
3178
3179
3180
3181
3182
3183
3184
3185
3186
3187
3188
3189
3190
3191
3192
3193
3194
3195
3196
3197
3198
3199
3200
3201
3202
3203
3204
3205
3206
3207
3208
3209
3210
3211
3212
3213
3214
3215
3216
3217
3218
3219
3220
3221
3222
3223
3224
3225
3226
3227
3228
3229
3230
3231
3232
3233
3234
3235
3236
3237
3238
3239
3240
3241
3242
3243
3244
3245
3246
3247
3248
3249
3250
3251
3252
3253
3254
3255
3256
3257
3258
3259
3260
3261
3262
3263
3264
3265
3266
3267
3268
3269
3270
3271
3272
3273
3274
3275
3276
3277
3278
3279
3280
3281
3282
3283
3284
3285
3286
3287
3288
3289
3290
3291
3292
3293
3294
3295
3296
3297
3298
3299
3300
3301
3302
3303
3304
3305
3306
3307
3308
3309
3310
3311
3312
3313
3314
3315
3316
3317
3318
3319
3320
3321
3322
3323
3324
3325
3326
3327
3328
3329
3330
3331
3332
3333
3334
3335
3336
3337
3338
3339
3340
3341
3342
3343
3344
3345
3346
3347
3348
3349
3350
3351
3352
3353
3354
3355
3356
3357
3358
3359
3360
3361
3362
3363
3364
3365
3366
3367
3368
3369
3370
3371
3372
3373
3374
3375
3376
3377
3378
3379
3380
3381
3382
3383
3384
3385
3386
3387
3388
3389
3390
3391
3392
3393
3394
3395
3396
3397
3398
3399
3400
3401
3402
3403
3404
3405
3406
3407
3408
3409
3410
3411
3412
3413
3414
3415
3416
3417
3418
3419
3420
3421
3422
3423
3424
3425
3426
3427
3428
3429
3430
3431
3432
3433
3434
3435
3436
3437
3438
3439
3440
3441
3442
3443
3444
3445
3446
3447
3448
3449
3450
3451
3452
3453
3454
3455
3456
3457
3458
3459
3460
3461
3462
3463
3464
3465
3466
3467
3468
3469
3470
3471
3472
3473
3474
3475
3476
3477
3478
3479
3480
3481
3482
3483
3484
3485
3486
3487
3488
3489
3490
3491
3492
3493
3494
3495
3496
3497
3498
3499
3500
3501
3502
3503
3504
3505
3506
3507
3508
3509
3510
3511
3512
3513
3514
3515
3516
3517
3518
3519
3520
3521
3522
3523
3524
3525
3526
3527
3528
3529
3530
3531
3532
3533
3534
3535
3536
3537
3538
3539
3540
3541
3542
3543
3544
3545
3546
3547
3548
3549
3550
3551
3552
3553
3554
3555
3556
3557
3558
3559
3560
3561
3562
3563
3564
3565
3566
3567
3568
3569
3570
3571
3572
3573
3574
3575
3576
3577
3578
3579
3580
3581
3582
3583
3584
3585
3586
3587
3588
3589
3590
3591
3592
3593
3594
3595
3596
3597
3598
3599
3600
3601
3602
3603
3604
3605
3606
3607
3608
3609
3610
3611
3612
3613
3614
3615
3616
3617
3618
|
\documentclass[portrait,20pt]{foils}
\usepackage{amsmath}
\usepackage{amssymb}
\usepackage{amsthm}
\usepackage{color}
\usepackage{subfigure}
\usepackage{graphicx}
\usepackage{hyperref}
%\usepackage[UTF8]{ctex}
\title{Software Project Management}
\author{}
\date{}
\MyLogo{Copyright \copyright 2018, 2019, 2020 Hui Lan}
\begin{document}
\maketitle
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\foilhead{Syllabus}
\begin{itemize}
\item Instructor: Hui Lan
\item Email: lanhui AT zjnu.edu.cn
\item Course home page: http://lanlab.org/course/2020s/spm/
\newpage
\item Recommended textbook: \\{\bf Karl Fogel}. Producing Open Source Software - How to Run a Successful Free Software Project. 2017.
Available online at \url{https://producingoss.com}. Most of the course materials are from the above textbook.
\includegraphics[width=0.50\textwidth]{fig/oss_cover}
\newpage
\item Grading:
\begin{itemize}
\item Quizzes - 15\%
\item Project - 25\%
\item Final Examination - 60\%
\end{itemize}
\end{itemize}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\foilhead{Quizzes}
{\bf Number of quizzes}.
I will post 7-10 quizzes throughout this semester on our course home page.
Each quiz will be posted one week before its due date.
You should check our course home page at least once a week to not miss any quiz.
{\bf Submission instructions}.
Class 02395 (consisting of students from Software Engineering (Chuyang), Computer Science and Technology, and Computer Networking) - submit through \href{https://www.duifene.com/}{Duifene}. Class code: {\bf AKVCJ}.
Class 02396 - submit through \href{http://118.25.96.118/nor}{LRR}. Course code: {\bf CSC322}.
Graduate students - submit through \href{http://118.25.96.118/nor}{LRR}. Course code: {\bf CSC1102}.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\foilhead{Course Project}
For people from Software Engineering (English), you have already
implemented OMG (Oh My Genes) and improved OAPS (Open Access
Publishing Service). Therefore, you could pick one of them to manage
for this course.
For people from Software Engineering (Chuyang), you have already spent
a lot of time on implementing
\href{http://lanlab.org/course/2019s/se/homepage.html#project}{a
software} for analyzing condition-dependent gene expression scatter
plots. So you will continue to work on (i.e., manage) that.
For other people, you will manage LRR.
You must form project groups by March 2. The group size can be 1, 2,
3, or 4, depending on your situation.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\foilhead{Final Exam}
Something I would talk later in this semester.
For now, I think that it will be a closed-book, 90-minute test.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\foilhead{Software Project Management Concepts}
Application of management activities - planning, coordinating,
measuring, monitoring, controlling, and reporting - to ensure that the
development and maintenance of software is systematic, disciplined,
and quantified.
{\it dis·ci·plined: showing a controlled form of behavior or way of working.}
{\em Textbook management looks so easy and real-world project management
is in fact so hard. -- Barry W. Boehm}
{\bf Capable people are no longer available.}
For example, the LRR's original author is no longer available to work
on the project. He has other more important commitments.
Some people (e.g., Jin Mingyi), maybe also including the original
author, think LRR is not maintainable.
{\bf Old plan becomes outdated very soon.}
You have a plan but you continuously get distracted by additional
``requests''. A flood of them is a phenomenon called {\em request
creep}.
\begin{itemize}
\item A request to add ``a few small capabilities'' to the product without changing the budget or
schedule.
\item A request to take on some personnel who are between projects and find something useful for them to do.
\item A request to reduce the scope of design review (in order to make up some schedule).
\end{itemize}
Should you simply be a nice guy and accommodate any request? No.
You should think carefully about the impact of the request. You
should be able to negotiate a corresponding change in plans, schedules
and budgets.
Steps I suggest you to follow.
\begin{enumerate}
\item Politely say ``No''.
\item Tell that I am willing to help if I am not that busy.
\item Analyze the impact of the additional requests on my current schedule.
\item Ask for more money or time, or both. (The management board would usually agree as they have already invested a lot, as long as your counter-requests are reasonable.)
\end{enumerate}
{\bf Other difficulties}.
Programmers with various background and various personal goals.
Programming languages.
Licenses.
Development processes.
Infrastructures.
{\bf Solutions}.
\begin{itemize}
\item Organizational.
\begin{itemize}
\item Get a lot of money. Get a lot of resources. Get a lot of support from government and funding bodies.
\item Make sure employees write clear documentation and self-documenting code before they leave the project.
\item Have a requirements management procedure.
\item Incentives. Make sure hard and productive workers are rewarded and project parasites are not rewarded (if not downgraded).
\item Make sure useful developers don't get marginalized due to personal idiosyncrasy.
\end{itemize}
\item Motivational. Understanding developers' motivations is the best way — in some sense, the only way — to manage a project.
\begin{itemize}
\item Establish a shared belief that people can do better together. The goal of management is to make people continue to believe so.
\item Get deep personal satisfaction from doing one's best work, and from appreciating and being appreciated by one's peers.
\item Coercive techniques don't work. People should feel that
their connection to a project, and influence over it, is
directly proportional to their contributions.
\item Monetary and non-monetary motivations. Extrinsic motivation and intrinsic motivation. Overjustification Effect.
\item {\bf Goodhart’s Law} - when a measure becomes a target, it ceases to be a good measure. Example: customer retention, tester bug reporting. Danger: people game the system.
\end{itemize}
\item Set standards for communications.
\end{itemize}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\foilhead{Proprietary Software}
{\em proprietary: relating to an owner or ownership.}
The software is owned by a company, which sets out many restrictions on use, modification and distribution. We need to pay (explicitly or implicitly) before we can use it.
Understandable because the company has spent a lot of money and made a lot efforts to develop and update the software.
Understandable because the company does not want its competitors to take advantages of its source code.
{\bf Mini assignment} (no submission required): read a proprietary software license and figure out the described restrictions.
Must be protected by law.
Good for society as the company makes profits and creates jobs.
For example, the Berkeley Software Distribution (BSD) group did not consider proprietary software a social evil.
But proprietary software can be bad for society if it goes too far.
``The rule made by the owners of proprietary software was, {\em If you share with your neighbor, you are a pirate. If you want any changes, beg us to make them}.'' -- Richard Stallman.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\foilhead{Free and Open Source Software}
These software are usually free of charge.
Many have very high quality.
You can read, modify or redistribute the source code, if the software is free or open source. For example, you can browse the source code for Ubuntu, Lubuntu and Xubuntu. Can you browse the source code for Windows 10?
Free and open-source software are quite prevalent today. Ubuntu, Firefox, Emacs, Nano, Apache Server, etc.
{\bf Free software emphasizes ideology}.
A noble cause.
For example, \href{https://www.gnu.org/education/edu-schools.en.html}{Why Schools Should Exclusively Use Free Software?}
Representative: Richard Stallman.
Four Essential Freedoms (run, study, modify, redistribute).
License: \href{https://www.gnu.org/licenses/gpl-3.0.en.html}{GPLv3} (approved by both FSF and OSI). Any derivative work must be
distributed under GPL too. Make freedom contagious.
%Creative Commons Attribution-ShareAlike. Share. Remix. Conditions: Attribution. Share Alike.
{\bf Open-source software emphasizes practicability}.
More practical.
Great convenience.
Community driven development model.
\href{https://opensource.org/licenses/category}{Various open source licenses}
%% {\tiny
%% \begin{verbatim}
%% 9. License Must Not Restrict Other Software
%% The license must not place restrictions on other software that is
%% distributed along with the licensed software. For example, the
%% license must not insist that all other programs distributed on the
%% same medium must be open-source software.
%% \end{verbatim}
%% }
``Given enough eyeballs, all bugs are shallow.''
{\bf The difference}.
The difference between free and open source is largely on philosophical matters.
{\em The two terms describe almost the same category of software, but they
stand for views based on fundamentally different values. Open source
is a development methodology; free software is a social movement. -- Richard Stallman}
{\bf The similarity}.
\begin{itemize}
\item You can modify the code.
\item You can redistribute the code, modified or original.
\item No warranties. Use it on your own risks.
\end{itemize}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\foilhead{Overhead at the Beginning}
Opening up a project can add whole new sets of complexities, and cost
more in the short term than simply keeping it in-house.
Extra work (or pure overhead at first) for the people least familiar
with the project to get started:
\begin{itemize}
\item Arrange the code to be comprehensible to complete strangers.
\item Write development documentation.
\item Set discussion forums.
\item Answer questions for potential developers.
\item Set other collaboration tools.
\item Set a project home page.
\item Automate compilation, packaging and installation.
\end{itemize}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\foilhead{Benefits in the Long Run}
Significant organizational benefits - let the outside world know what
you are doing.
A low-cost form of advertisement.
Global influence.
Benefits greatly outweigh the costs. For example, Microsoft Loves Open Source (treat open source a development methodology and business strategy).
{\bf Reap the benefits}.
{\em The sponsor only pays a small number of expert programmers to
devote themselves to the project full time, but reaps the benefits of
everyone's contributions, including work from programmers being paid
by other corporations and from volunteers who have their own disparate
motivations (for moral reasons, their employer paid them to, or
because they're building up their résumé).}
Example: \href{https://hadoop.apache.org/who.html}{Huawei on Hadoop}.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\foilhead{Browser Wars}
Non-trivial and incompatible interfaces: ftp, telnet, email, gopher, lynx.
Limited to people with reasonable programming skills.
Netscape's contribution: first made Internet accessible to average people.
Netscape versus IE in early days (mid and late 1990's).
\begin{itemize}
\item Netscape.
\begin{itemize}
\item 1993. Primitive Mosaic browser (multimedia web pages).
\item 1994. Mosaic Communications Corporation, then Netscape Communications. Mosaic Netscape 0.9, then Netscape Navigator 1.0. Over three-quarters of the browser market within three months of launching. From 5 to 2000 programmers. Virtually no competitors.
\item 1995. IPO, market value of 2.9B. A highly innovative product. Thousands of employees.
\item 1997. Netscape Communicator: Netscape Navigator, Netscape Address Book, Netscape Mail, Newsgroups, and Netscape Composer.
\item 1998. BAD YEAR. Netscape Communicator 5.0 release delayed (and never released). Acquired by AOL for 4.2B.
\item 2000. Netscape 6.0.
\item 2002. Netscape 7.0.
\item 2003. AOL closed the Netscape department, outsourced it to Mercurial Communications, a Canadian Company.
\item 2007. Netscape Navigator 9. Market share: IE 77.4\%, Firefox 16\%, Netscape 0.6\%.
\item 2008. Shut down by AOL. No more support. No further releases.
\end{itemize}
\item IE.
\begin{itemize}
\item 1994. Microsoft talked to Netscape about licensing browser technology. Declined by Netscape.
\item 1995. Microsoft IE 1.0, 2.0
\item 1996. IE 3.0
\item 1997. IE 4.0
\item 1998. IE 5.0. Consistently better product, in terms of speed and stability, bundled with Windows OS (dominating desktop market). Free of charge.
\end{itemize}
\end{itemize}
%All browsers https://www.techpaparazzi.com/how-web-browsers-looked-from-in-90s/
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\foilhead{Coopetition}
Publish standards.
Win partners and share the market and profits.
General Electric: EDI.
Sun: Java applets.
Informix: database access through browsers.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\foilhead{Jamie Zawinski and Joel Spolsky}
``In January 1998, Netscape hit one of its blackest periods -- the first round of layoffs… At this point, I strongly believed that Netscape was no longer capable of shipping products. Netscape's engineering department had lost the single-minded focus we once had, on shipping something useful and doing it fast. That was no longer happening. Netscape was shipping garbage, and shipping it late.'' - Jamie Zawinski, Former engineer, Netscape.
``Now the problem here is that the product's direction changed utterly. Our focus in the client group had always been to build products and features that people wanted to use. That we wanted to use. That our moms wanted to use. 'Groupware' is all about things like 'workflow', which means, 'the chairman of the committee has emailed me this checklist, and I'm done with item 3, so I want to check off item 3, so this document must be sent back to my supervisor to approve the fact that item 3 is changing from 'unchecked' to 'checked', and once he does that, it can be directed back to committee for review.' Nobody cares about that shit. Nobody you'd want to talk to, anyway.” - Jamie Zawinski.
``Open source does work, but it is most definitely not a panacea. If there's a cautionary tale here, it is that you can't take a dying project, sprinkle it with the magic pixie dust of ``open source,'' and have everything magically work out. Software is hard. The issues aren't that simple.'' - Jamie Zawinski.
``The old mantra 'build one to throw away' is dangerous when applied to large scale commercial applications. If you are writing code experimentally, you may want to rip up the function you wrote last week when you think of a better algorithm. That's fine. You may want to refactor a class to make it easier to use. That's fine, too. But throwing away the whole program is a dangerous folly, and if Netscape actually had some adult supervision with software industry experience, they might not have shot themselves in the foot so badly.'' - Joel Spolsky, Software engineer, and co-founder, Glitch
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\foilhead{Lessons from the Competition}
{\bf Netscape's mistakes}.
Poor product, poor product decisions, product direction.
Became too big. Stopped innovation.
{\em Feature creep}. Kept adding features with ``no break, no time for rearchitecture''. Consequences: (1) Messy codebase. (2) Buggy product.
\href{https://yujiri.xyz/software/features}{Features are costs}.
%Feature bloat (too ambitious). Bloatware. Groupware.
Lost single-minded focus.
5.0 never released. 6.0 released prematurely after 3 years (under management pressure).
%Outdated browser core.
MISTAKE. Try to do everything from scratch (in year 1998).
Anti-Microsoft.
Crufty, complicated code.
%JOEL SPOLSKY https://www.joelonsoftware.com/2000/04/06/things-you-should-never-do-part-i/
{\bf IE's upper hand}.
Pricing: always ``Free of charge''. Giant Microsoft could afford it. ``Destroying that market''.
Distribution: bundled with Windows 98. Most people \href{http://www-inst.eecs.berkeley.edu/~eecsba1/sp98/reports/eecsba1c/pj1/freq.gif}{do not switch browsers}.
PC makers are locked in to using Windows 98.
Developer support.
Not that bad in the beginning, and consistently better afterwards. Frequent releases.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\foilhead{Status quo}
Netscape Navigator evolved to Firefox (open source managed by Mozilla Foundation).
Internet Explorer evolved to Edge (using Chromium core).
Even more browsers nowadays: Firefox, Chrome, Safari, Edge, Opera, UC Browser, QQ, 360, Sogou, Baidu, etc. Which one are you using now? Which one will win?
I am using Edge now. (I used Firefox many years.) I think unless
you have a clear advantage in your product, it is very hard to compete
with a company who bundles its product with its operating system. For
most users, why do they need to bother with downloading something
(usually big) that is not far superior to the default one
which is free?
% 95\% of the users are laymen.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\foilhead{Starting from Scratch}
How to treat old code wisely? Throw it away?
Why do programmers want to start from scratch? Fundamental Law of Programming (Joel Spolsky): It’s harder to read code than to write it.
Starting from scratch can be an absurd strategy or behavior.
Startup company killer: Build one to throw away.
Big misconception: New code is better than old.
Reasons;
\begin{itemize}
\item You cannot guarantee that new code is better than old code.
\item When we add code, we add functionality, and bugs as well.
\item While old code looks ugly, new code can be even worse.
\item You may make old mistakes again, and make new mistakes.
\item Old code has been used, tested and fixed. New code has not. This means tremendous efforts and time (usually invisible to you) have been invested in the old code. That's money.
\item Old code: maybe the fix is just one line of code, or just a few characters. But that demands tremendous efforts. Throwing away code is throwing away the efforts, sometime years of programming work.
\item (Old code) doesn’t acquire bugs just by sitting around on your hard drive. - Joel Spolsky.
\end{itemize}
{\bf Software years}. Even if your new code is better, you may be several software years behind, and therefore, lose market.
% Things You Should Never Do, Part I https://www.joelonsoftware.com/2000/04/06/things-you-should-never-do-part-i/
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\foilhead{Use Branches to Avoid Bottlenecks}
Helpful for collaborative development.
Release branch, bugfix branch, experimental branch, etc.
Branches are valuable because they turn a scarce resource — working room in the project's code — into an abundant one.
Branches are cheap to make.
Copy the castle and add a drawbridge in isolation.
Make Pull Requests, ask for review, and merge (when all reviewers are happy).
Isolate and stabalise the release line to the development line.
Use branches liberally.
Most branches should merge their changes back into the main line and disappear, as soon as possible.
When we do the merge, indicate that this is a merge in the log message.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\foilhead{Pull Requests}
Have you heard of {\em patches}.
A \underline{pull request} is a request from a contributor to the
project that a certain change be "pulled" (merged) into the project.
Once a contribution arrives, it typically goes through a
\underline{review-and-revise} process, involving communication between
the contributor and various members of the project.
The moment when a code change is merged to the project's master branch
is when it becomes officially part of the project.
99.9\% of contribution to the project should go through the {\em Pull Request - Review - Revise - Merge process}.
``\href{https://ben.balter.com/2014/11/06/rules-of-communicating-at-github/}{There’s only one way to change something}'', Pull Request.
A pull request should have a single purpose.
If you have many purposes, then create many branches and make many pull requests.
Why?
Easier to refer to a small item, and easier to review a small item.
Example of multiple purposes in a single pull request:
\href{https://github.com/lanlab-org/LRR/pull/21/}{Allowing all group member to submit assignment and allowing Lecturer to edit assignments}
\href{https://github.com/lanlab-org/GeneExpressionScatterPlot-Yu-Ye/pull/4}{Update README.md, change user guidance, fix csv exporting display probelm}
You should wait other people to review your changes before you merge them to the master branch.
Exceptions: the changes are trivial, the changes are unlikely to break the build, or no review for more than one week.
Use pull request to communicate ideas.
Use pull request to learn the code base.
Once your change is merged, your change is part of the software.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\foilhead{Essential Git Commands}
git branch
git checkout -b FIX-README
git add .
git commit -m "README.md: Why, What, How?"
git pull origin master
git push origin FIX-README
git checkout FIX-README
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\foilhead{Announcing}
Show your \underline{presentable} work to the world.
Put the announcement on the project home page.
Post the announcement in the appropriate forums. One post per forum.
General forum: https://news.ycombinator.com/
https://www.reddit.com/r/ subdirectories: opensource, programming, software.
Topic-specific forums: mailing lists, web forums.
Register at: \href{https://freshcode.club/}{fresh(code)}, \href{http://openhub.net/}{Black Duck Open Hub}.
Make sure your announcement contain keywords that would help search engines find your project.
Your announcement should be short and to the point.
{\tiny
\begin{verbatim}
To: discuss@some.forum.about.search.indexers
Subject: [ANN] Scanley, a new full-text indexer project.
Reply-to: dev@scanley.org
This is a one-time post to announce the creation of the Scanley
project, an open source full-text indexer and search engine with a
rich API, for use by programmers in providing search services for
large collections of text files. Scanley is now running code, is
under active development, and is looking for both developers and
testers.
Home page: http://www.scanley.org/
Features:
- Searches plain text, HTML, and XML
- Word or phrase searching
- (planned) Fuzzy matching
- (planned) Incremental updating of indexes
- (planned) Indexing of remote web sites
- (planned) Long-distance mind-reading
Requirements:
- Python 3.2 or higher
- SQLite 3.8.1 or higher
For more information, please come find us at scanley.org!
Thank you,
-J. Random
\end{verbatim}
}
Running code provides the best foundation for success.
Without running code? It may also work. Subversion (a design document, core developers). But there has to be something {\bf concrete/tangible} than just good intentions.
You can announce after you made the project open-source.
What you should expect:
- {\bf No big impact}. Keep 1.0 quiet.
- Some casual inquires.
- A few more people in your mailing list.
Announcing is seeding.
Form exponential communications networks.
Project $\rightarrow$ Community.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\foilhead{More Comments than Code}
Not only code comments.
But also Pull Request Comments.
% https://ben.balter.com/2017/05/23/seven-ways-to-consistently-ship-great-features/
{\small
\begin{verbatim}
Software Code Comment Code/Comment
---------------------------------------------------------
GNU Nano 17718 3773 4.7
Git 474195 63652 7.4
Ubuntu 600750 120283 5.0
Apache HTTP Server 1512918 160160 9.4
MySQL 8631127 2754165 3.1
OpenStack 12951523 3146489 4.1
Android 16218632 4849352 3.3
Firefox 20684598 4528549 4.6
Linux Kernel 36680915 6701533 5.5
KDE 58707319 14434617 4.1
December 2019 Data
Source: OpenHub https://www.openhub.net/
Copyright (C) 2020 Lan Hui
\end{verbatim}
}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\foilhead{Version (revision) Control System}
The core of version control is \underline{change management}: who made which change on which date.
Two models:
\begin{enumerate}
\item Lock-Modify-Unlock
\item Copy-Modify-Merge
\end{enumerate}
{\bf commit} - make change to the project. "I just committed a fix for the server crash bug people have been reporting on Mac OS X. Jay, could you please review the commit and check that I'm not misusing the allocator there?"
{\bf push} - publish a commit to a publicly online repository.
{\bf pull} (or update) - pull others' changes (commits) into your copy of the project.
{\bf commit message} or log message - commentary attached to each commit, describing the nature and purpose of the commit.
{\bf repository} - a database in which changes are stored and from which they are published.
{\bf clone} - obtain one's own development repository by making a copy of the project's central repository. My fork.
{\bf checkout} - switch to a branch
{\bf revision or commit} - "Oh yes, she fixed that in revision 10" or "Ashly fixed that in commit \href{https://github.com/lanlab-org/LRR/pull/21/commits/2a6ed869ffc332bfceb2cb77b6a5754353650667}{2a6ed86}".
{\bf diff} - textual representation of a change.
{\bf tag or snapshot} - Release\_1\_0, Delivery\_20130630.
{\bf branch} - a copy of the project, under version control but isolated so that changes made to the branch don't affect other branches of the project. A great way to have multiple, independent lines of development. ``main line'', ``trunk'', ``master'', ``release branch''.
{\bf merge} - move a change from one branch to another.
{\bf conflict} - when two people try to make different changes to the same place in the code. ``resolve'' the conflict.
{\bf revert} - undo an already-committed change to the software.
What files should be put under version control?
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\foilhead{Choosing a version control system}
Git and Github.
% https://ben.balter.com/2014/11/06/rules-of-communicating-at-github/
https://www.mercurial-scm.org
http://fossil-scm.org/
https://subversion.apache.org
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\foilhead{Version everything}
Any piece of information worth writing down is worth versioning \underline{in one place}.
Source code, web pages, documentation, FAQ, design notes.
Don't keep \underline{programmatically generated files} under version control.
Things that don't change should be archived. For example, emails.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\foilhead{Refactoring Old Code and Building Upon It}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\foilhead{Losing Focus}
Don't even think about creating bloatware, or groupware.
Carry on your product vision.
Many Distractions, One True North.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\foilhead{Rhythm of Releases}
Successful software releases new versions regularly, e.g., \href{https://wiki.ubuntu.com/Releases}{Ubuntu}.
To do that, the developers must have a release plan.
Users know people behind the software are still improving it.
Therefore, they feel more secure while using the software to do their business.
A new release is like a booster shot to boost users' interest.
Make sure you give people at least one Big booster shot yearly.
However, too-frequent releases are considered not necessary for mature products. Why?
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\foilhead{Joel Test}
Answer the following 12 questions to measure how good a software team is.
\begin{itemize}
\item Do you use source control?
\item Can you make a build in one step?
\item Do you make daily builds?
\item Do you have a bug database?
\item Do you fix bugs before writing new code?
\item Do you have an up-to-date schedule?
\item Do you have a spec?
\item Do programmers have quiet working conditions?
\item Do you use the best tools money can buy?
\item Do you have testers?
\item Do new candidates write code during their interview?
\item Do you do hallway usability testing?
\end{itemize}
Microsoft scores at 12. Most companies, 2-3.
% https://www.joelonsoftware.com/2000/08/09/the-joel-test-12-steps-to-better-code/
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\foilhead{Managers}
Management styles:
\begin{itemize}
\item Command-and-Conquer model. Cogs do the job. Charge on a minefield when caught in an ambush.
\item Servant model. Creating \href{https://www.joelonsoftware.com/2006/04/11/the-development-abstraction-layer-2/}{Abstraction layer for Programmers} (first priority).
\item Eco 101 model. Cash reward subverts instrinsic motivation.
\item Identity model. Virtuous goal. Explain why we do this, but not that.
\end{itemize}
``If a programmer somewhere is worrying about a broken chair, or waiting on hold with Dell to order a new computer, the abstraction has sprung a leak.'' - Joel Spolsky.
Convert code into products below the decks.
Quiet private office, a great computer, unlimited beverages, a comfortable ambient temperature.
Roman army: 4 servants for every soldier.
Modern army: 7:1.
``Even minor frustrations caused by using under-powered tools add up, making programmers grumpy and unhappy. And a grumpy programmer is an unproductive programmer.'' - Joel Spolsky.
Dolly Parton.
Bad management: \href{https://www.joelonsoftware.com/2006/08/09/the-econ-101-management-method/}{Econ 101 management}. ``Management simply doesn’t know how to teach people to do better work, so they force everybody in the system to come up with their own way of doing it.''
In the Zone.
A good manager is a good listener.
A good manager is involved.
A good manager participates himself.
A good manager cares about the quality of the project.
A good manager never rewards unsatisfactory behavior.
A good manager is a role model.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\foilhead{Micromanagement}
Cannot {\em scale}.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\foilhead{Customers}
``Customers Don’t Know What They Want. Stop Expecting Customers to Know What They Want.'' - Joel Spolsky.
Iceberg Secret.
They want to see pretty pixels.
All about pixels.
Psychology: making people feel better.
% ``Use scrawls for the icons on the toolbar until the functionality is there.'' - Joel Spolsky.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\foilhead{Testers}
{\bf Any big program has bugs}.
QA department.
Testers are your software's first users.
The point is to get feedback.
Programmers need immediate feedback from testers, positive or negative. 2:1.
A dialogue, not a monologue.
Payback. Positive reinforcement.
Apply for a tester job, even if you don't know how to write program. Pick up a good book on testing. Learn automated test suites.
Not only test whether a program works or not, but also check things like
text fonts, colors, user interfaces.
Misconception: let the worst programmer do the job (testing).
Consequence: an incompetent team consistently producing poor products.
\href{http://catb.org/~esr/writings/cathedral-bazaar/cathedral-bazaar/ar01s04.html}{Debugging is parallelizable}.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\foilhead{Don't Want to Hire Testers}
Microsoft hires many.
Some companies do not believe in testing.
\href{https://www.joelonsoftware.com/2000/04/30/top-five-wrong-reasons-you-dont-have-testers/}{Reasons}:
\begin{itemize}
\item I can’t afford testers!
\item My customers will test the software for me.
\item Bugs come from lazy programmers.
\item My software is on the web. I can fix bugs in a second.
\item Anybody qualified to be a good tester doesn’t want to work as a tester.
\end{itemize}
Need one tester for two programmers.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\foilhead{Employees}
Two kinds of employees divided by their primary purposes:
Make the company successful.
Make themselves successful.
Employ only one employee for a consistent architecture at early days.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\foilhead{Knowledge Workers}
Need absolute concentraction.
Quiet and private space - documented productiviity gain.
Flow.
Get into ``{\bf the zone}''.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\foilhead{Morale}
TBD.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\foilhead{Software demo}
Software demo is a marketing effort for ``\href{https://www.joelonsoftware.com/2002/02/13/the-iceberg-secret-revealed/}{speculative}'' software.
Image matters most.
Best venue in town.
Dress slightly better than audience.
Right room size.
Play good music while people are waiting.
Make everything as big as possible.
Serve coffee.
Tell a story.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\foilhead{Productivity}
Fire and Motion.
Launch the editor.
Move forward a bit, every day.
``Many of my days go like this: (1) get into work (2) check email, read the web, etc. (3) decide that I might as well have lunch before getting to work (4) get back from lunch (5) check email, read the web, etc. (6) finally decide that I’ve got to get started (7) check email, read the web, etc. (8) decide again that I really have to get started (9) launch the damn editor and (10) write code nonstop until I don’t realize that it’s already 7:30 pm.'' - Joel Spolsky.
``Everyday our software is better and better.'' - Joel Spolsky.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\foilhead{Metcalfe’s Law}
The value of a network grows by the square of the size of the network.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\foilhead{Delphi Effect}
The ensemble method.
The averaged opinion of a mass of equally expert observers is quite a
bit more reliable a predictor than the opinion of a single
randomly-chosen one of the observers.
Variations in experts is important.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\foilhead{Lock-in}
Unable / unwilling to switch.
Stealth lock-in. Free for the first three months.
Phone number.
Word processor.
Customer acquisition.
%A record of the past activities for future reference.
%% %% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% %% \foilhead{The nature of software engineering}
%% %% {\em Software is hard. -- Jamie Zawinski}
%% %% \begin{itemize}
%% %% \item Complex
%% %% \item Iterative
%% %% \item Creative and cooperative
%% %% \item Changing technology
%% %% \end{itemize}
%% %% Common problems in software industry: unrealistic
%% %% requirements/expectations, vague specifications, poor staff
%% %% management, and ignoring user feedback.
%% %% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% %% \foilhead{Triple constraints for software projects}
%% %% Time, Cost and Quality.
%% %% {\em Defer the activity of detecting and correcting software problems
%% %% until late in the project, i.e., in the “test and validation” phase
%% %% after the code has been developed. There are two main reasons why
%% %% this is a mistake: (1) Most of the errors have already been made
%% %% before coding begins; and (2) The later an error is detected and
%% %% corrected, the more expensive it becomes. - Barry W. Boehm}
%% %% The following figure shows ``increase in cost to fix or change software
%% %% throughout life cycle''.
%% %% \begin{center}
%% %% \includegraphics[width=0.80\textwidth]{fig/BoehmCurve_real}
%% %% \end{center}
%% %% {\bf Important lesson: the longer you wait to detect and correct an error, the more it costs you - by a long shot.}
%% %% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% %% \foilhead{Aspects of management}
%% %% Organisational policy management. Specific organisation-wide procedures for designing, implementing, estimating, tracking and reporting. Beneficial in the long-term.
%% %% Personnel management. Specific organisation-wide procedures for hiring, training, motivating and promoting people.
%% %% Communication management.
%% %% Portfolio management. Having an overall vision not only of the software under development, but also of the software already in use in an organisation.
%% %% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% %% \foilhead{Elements of project management}
%% %% People, Product, Process, Project.
%% %% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% %% \foilhead{The people}
%% %% The \underline{people factor} is the most important factor in SPM. Anyhow, we need right people to do the right thing.
%% %% The manager who forgets that SE work is an {\em intensely human endeavor} will never success in project management.
%% %% \newpage
%% %% VP1: I guess if you had to pick one thing out that is most important to our environment, I'd say it is not the tools that we use; it is \underline{the people}.
%% %% VP2: The most important ingredient that to be success on this project was having \underline{smart people}...very little else matters in my opinion.
%% %% VP3: The only rule I have in management is to ensure I have \underline{good people} -- real, good people -- and that I grow good people -- and that I provide an environment in which good people can produce.
%% %% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% %% \foilhead{People Capability Maturity Model}
%% %% Capability Maturity Model Integration.
%% %% A maturity model describes maturity level of an organisation.
%% %% Originally called SEI, now called CMMI Institute. CMU (now acquired by ISACA), adopted and funded by U.S. DoD.
%% %% Generic, not just for software engineering.
%% %% For organisations, for organisations seeking to improve their process, for appraising/evaluating an organisation's maturity level (1-5).
%% %% For people, PCMM is an integrated set of best practices that improves performance and key capabilities for organizations that want to improve their critical people management processes.
%% %% \begin{center}
%% %% \includegraphics[width=0.95\textwidth]{fig/PCMM}
%% %% \end{center}
%% %% \begin{center}
%% %% \includegraphics[width=0.95\textwidth]{fig/P-CMM}
%% %% \end{center}
%% %% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% %% \foilhead{The product}
%% %% Define product \underline{objectives} and \underline{scope}. Consider alternative solutions.
%% %% Objectives: overall goals for the product (from the customer's point of view) without considering how these goals will be achieved.
%% %% Scope: primary data, functions, behaviours that charaterises and bounds these characteristics in a quantitative manner.
%% %% Alternatives: do we have better alternatives, considering the constraints on delivery deadline, budgets, personnel availability, etc.
%% %% %Talk about OMG's SRS.
%% %% %SE\_UserRequirementsDocument.
%% %% %{\tiny https://lumos-hello.readthedocs-hosted.com/en/latest/}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\foilhead{The process}
Use new and existing processes to move a project forward to success.
Waterfall
\begin{center}
\includegraphics[width=0.80\textwidth]{fig/waterfall_marsic}
\end{center}
Prototyping
The spiral model (Boehm)
Agile (popular nowadays)
\begin{center}
\includegraphics[width=0.80\textwidth]{fig/ExtremeProgramming}
\end{center}
Scrum (seems really widely used nowadays).
%% %% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% %% \foilhead{The project}
%% %% Projects: 26\% failed, 46\% experienced cost and schedule overruns.
%% %% We have to conduct {\em planned} and {\em controlled} software projects.
%% %% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% %% \foilhead{PMBOK}
%% %% Project Management Body of Knowledge includes the following KAs (knowledge areas):
%% %% project integration
%% %% project scope
%% %% project time
%% %% project cost
%% %% project quality
%% %% project human resource
%% %% project communication
%% %% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% %% \foilhead{SWBOK}
%% %% A closely related body of knowledge (Software Engineering Body of Knowledge).
%% %% \begin{center}
%% %% \includegraphics[width=0.50\textwidth]{fig/swebok_wiki}
%% %% \end{center}
%% %% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% %% \foilhead{Measurement and management}
%% %% Management without measurement suggests a lack of rigor.
%% %% Measurement without management suggests a lack of purpose or context.
%% %% Management and measurement without \underline{expert knowledge} is equally ineffectual.
%% %% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% %% \foilhead{The top 5 factors found in successful projects}
%% %% %{\tiny \texttt{http://www.umsl.edu/_titlt_sauterv/analysis/6840_f03_papers/frese/}}
%% %% \begin{itemize}
%% %% \item \underline{User Involvement}
%% %% \item Executive Management Support
%% %% \item Clear Statement of Requirements
%% %% \item Proper Planning
%% %% \item Realistic Expectations
%% %% \end{itemize}
%% %% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% %% \foilhead{The top 5 indicators found in challenged projects}
%% %% \begin{itemize}
%% %% \item Lack of \underline{User Input}
%% %% \item Incomplete Requirements \& Specifications
%% %% \item Changing Requirements \& Specifications
%% %% \item Lack of Executive Support
%% %% \item Technical Incompetence
%% %% \end{itemize}
%% %% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% %% \foilhead{All the top factors found in {\em failed} projects}
%% %% \begin{itemize}
%% %% \item Incomplete Requirements
%% %% \item Lack of \underline{user involvement}
%% %% \item Lack of Resources
%% %% \item Unrealistic Expectations
%% %% \item Lake of Executive Support
%% %% \item Changing Requirements \& Specifications
%% %% \item Lack of Planning
%% %% \item Didn't Need it Any Longer
%% %% \item Lack of IT management
%% %% \item Technical Illiteracy
%% %% \end{itemize}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\foilhead{Effort and Reward}
When \underline{effort} and \underline{reward} do not correlate reliably, most people will lose faith and stop investing effort.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\foilhead{Form and Substance}
Non-technical management.
Language of customers (pretty pixels) versus language of programmers (data structure and algorithms).
You should {\em look} prepared.
Appearances matter.
Iceberg Secret: 90\% underwater is programming work. 10\% which customers can see is user interface work. \href{https://www.joelonsoftware.com/2002/02/13/the-iceberg-secret-revealed/}{People Who Aren’t Programmers Do Not Understand This}.
Form is substance. E.g., project presentation gives people an {\em immediate first impression}.
Joel Spolsky's Corollaries:
\begin{itemize}
\item If you show a nonprogrammer a screen which has a user interface that is 90\% worse, they will think that the program is 90\% worse.
\item If you show a nonprogrammer a screen which has a user interface which is 100\% beautiful, they will think the program is almost done.
\item When you’re showing off, the only thing that matters is the screen shot. Make it 100\% beautiful.
\end{itemize}
Project home page is the first thing (probably also the last thing) a visitor learns about a project.
Text editor project home pages:
\begin{itemize}
\item nano: https://www.nano-editor.org/
\item vim: https://www.vim.org/
\item emacs: https://www.gnu.org/software/emacs/
\item notepad++: https://notepad-plus-plus.org/
\end{itemize}
How would you describe each's look and feel?
Convey this message: ``your time will not be wasted if you get involved.''
One most important principle to make a project home page: people should have a rough idea where a link goes before clicking on it.
Supply information, also supply comfort.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\foilhead{Canned hosting}
Github
Bitbucket
Launchpad
Savannah
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\foilhead{Looking for Existing Solutions First}
Maybe not worthwhile to {\em reinvent the wheel}. Instead, add some functionality to the existing ones.
Exceptions: for educational purposes, for very specialised applications, for national security.
Places to look at:
Search engines. Bing, Google, Baidu, etc.
https://github.com
https://freshcode.club
https://openhub.net
https://directory.fsf.org
If you cannot beat it, join it.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\foilhead{Starting from What You Have}
Transforming a private vision into a public one.
What is obvious to you is not obvious to the world.
Help visitors understand your project.
Lower hacktivation energy.
What your project is and is not?
Strengths (for attacting people) and limitations (for setting expectation).
Dependencies and assumptions.
Write a mission statement, a README. Rearrange the code tree so that it conforms to widely accepted standards. Document the fundamental architectural assumption.
Code tree: src/, bin/, lib/, etc/, include/, test/, share/, data/, example/, doc/, README, LICENSE, COPYING, MANUAL, TUTORIAL, FAQ, ...
\href{https://github.com/github/choosealicense.com}{Choose a license}.
Drudgery and no immediate benefit.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\foilhead{Continuous Improvement}
While developing a software application is important, improving it is
more important.
\href{https://www.joelonsoftware.com/2001/07/21/good-software-takes-ten-years-get-used-to-it/}{10-year Rule}.
It is hard to develop a software application, and {\em even harder} to
continuously improve it, partly because people like new things and
partly because people don't have enough motivation to read and
maintain old code.
\href{https://www.joelonsoftware.com/2000/04/06/things-you-should-never-do-part-i/}{It’s harder to read code than to write it}.
Your software application becomes dead in the day when you stop improving
it.
You software application turns alive soon after you start improving
it.
\href{https://savannah.gnu.org/users/bens}{Benno Schulenberg} \href{https://git.savannah.gnu.org/cgit/nano.git/log/}{maintians} the Nano text editor.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\foilhead{No Need to Provide Everything At Once}
Don't let tasks overwhelm you.
It would be prohibitively time-consuming to do the following:
\begin{itemize}
\item A thorough design document
\item A complete user manual
\item Beautifully and portably packaged code
\item Platform independent
\end{itemize}
Provide the basics that can help newcomers to overcome initial obstacle of unfamiliarity.
\underline{Hacktivation energy}: the amount of energy a newcomer must put in before he starts getting something back.
You should make efforts to lower this energy threshold.
\underline{Friction}: energy that a potential contributor needs to become a real contributor.
% https://ben.balter.com/2013/08/11/friction/
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\foilhead{Starting a New Project}
{\bf Choose a good name}.
A bad name can slow down adoption of the project.
Good names: Project Apollo, Manhattan Project, Gutenberg Project, GNU Project, Gnome Project.
Unique.
Easy to remember.
Not infringing on any trademarks.
Spread your project's name.
Own your project's name in as many of the relevant namespaces, e.g., twitter, IRC channels, github, weibo, ... The same project name should be available at as many places on the Internet as possible. Why? People can easily find you and check how your project is doing.
\begin{itemize}
\item Internet domain name (a simple URL). For example, https://www.gnome.org
\item Twitter handle
\item Username at github
\item Account name at a microblog site (e.g., weibo.com)
\item \href{http://lanlab.org/course/2020s/spm/irc-instruction.txt}{IRC} (Internet Relay Chat). Example: \#spm at irc.freenode.org.
\end{itemize}
{\bf Have a clear mission statement}.
Concrete, limiting and {\em short}. Should target at specific audience. Should be prominently placed on the front page. For example, Hadoop (a distributed computing software which is able sort 1TB data on 910 nodes in less than 4 minutes).
https://hadoop.apache.org/
\newpage
{\scriptsize
\begin{verbatim}
The Apache™ Hadoop® project develops open-source software for
reliable, scalable, distributed computing.
The Apache Hadoop software library is a framework that allows for the
distributed processing of large data sets across clusters of
computers using simple programming models. It is designed to scale up
from single servers to thousands of machines, each offering local
computation and storage. Rather than rely on hardware to deliver
high-availability, the library itself is designed to detect and
handle failures at the application layer, so delivering a
highly-available service on top of a cluster of computers, each of
which may be prone to failures.
\end{verbatim}
}
Your mission statement is mainly aimed at people with some knowledge
about the related technique. Familiar with terms like ``cluster'' and ``high-availability''.
{\bf State that the project is free}.
The front page must make it \underline{unambiguously} clear that the project is open source.
State that project is ``free and open-source'' and give an example
license.
Many people forget to do that.
In extreme cases, the license was not given anywhere on the project's site
at all — the only way to find it was to download the software and look
at the license file inside the package.
{\tiny
\begin{verbatim}
Inkscape license
================
Most of Inkscape source code is available under the GNU General Public License,
version 2 or later, with the exception of a few files copied from GIMP, which
are available under GNU GPL version 3 or later. As such, the complete binaries
of Inkscape are currently covered by the terms of GNU GPL version 3 or later.
Several standalone libraries contained in Inkscape's source code repository are
available under GNU Lesser General Public License or the Mozilla Public License.
See the files GPL2.txt and GPL3.txt for the full license text.
\end{verbatim}
}
{\bf Demos, screenshots, videos, and example output}.
Show that the software works. Prepare a short video (less than 4 minutes) and {\em say} this video is short.
{\bf Features and requirements list}.
If not completed yet, put ``planned'' or ``in progress''.
{\tiny
\begin{verbatim}
MISSION STATEMENT
To create a full-text indexer and search engine with a rich API, for
use by programmers in providing search services for large
collections of text files.
FEATURES
Searches plain text, HTML, and XML
Word or phrase searching
(planned) Fuzzy matching
(planned) Incremental updating of indexes
(planned) Indexing of remote web sites
REQUIREMENTS
Python 3.2 or higher
Enough disk space to hold the indexes (approximately 2x original data size)
\end{verbatim}
}
{\bf Development status}.
How is the project doing?
Promise versus reality.
Are the people there, getting things done?
{\em How active} is the project developed or maintained?
How active is the community.
Show News, near-term goals and needs, past releases (with feature lists), timeline of recent releases, bug tracker, discussion forum, and mailing list.
Examples: \url{https://launchpad.net/drizzle}, \url{https://launchpad.net/inkscape}, \url{https://launchpad.net/schooltool}.
Release notes: \url{http://wiki.inkscape.org/wiki/index.php/Release\_notes}
{\bf Development status should always reflect reality}.
Conservativism pays off in the long run; it's always better for the software to be more stable than the user expected than less.
Alpha - first release, with known bugs.
Beta - serious known bugs fixed, asking users for detailed feedback.
Production.
{\em 10-year Rule}. \href{https://www.joelonsoftware.com/2001/07/21/good-software-takes-ten-years-get-used-to-it/}{Good Software Takes Ten Years. Get Used To it}. Sustained effort is needed.
Lotus Notes. 5 years' work before 1.0, released in 1989. From first line of code in 1984, to 10m users in 1995, 11 years have passed.
Oracle DB (1977). Microsoft Word 1.0 (1983). All selling billions of dollars yearly.
QQ (1998).
\underline{Lessons}: (i) it takes many years before your software is good enough and serious enough for people to buy it. The Overhype syndrome. (ii) No time to add many wanted features to 1.0 in a short period of time. The Get Big Fast syndrome. (iii) When it is done, it is {\em done}. Additional features are not essential. (iv) ``We’ll Ship It When It’s Ready'' syndrome.
Keep 1.0 quiet.
We are not writing software any faster than before. We just release more often.
{\bf Downloads}.
Downloadable as source code. Conforming to standard build and installation methods.
Otherwise, someone visits a web site, downloads the software, tries to build it, fails, gives up and goes away.
{\bf Version control and bug tracker access}.
You need a version control repository (e.g., a repo at GitHub, a repo at savannah, a repo on your own server).
\begin{itemize}
\item Create an account at GitHub. New an empty repo there.
\item Clone that empty repo to your local machine. \\
\texttt{git clone https://github.com/account/repo.git}.
\item Inside Git Bash, change directory to that local repo.
\item After you have added files into that repo, issue the following commands, \texttt{git add .}, \texttt{git commit -m 'message'}, \texttt{git push origin}.
\end{itemize}
We also need a bug tracker (visible from the homepage of the
project).
For example, Bugzilla (started in 1998).
Anyone tried \href{http://www.fogbugz.com/}{FogBugz}?
The {\em higher} the number of bugs in the database, the {\em better} the project looks.
It \href{https://www.rants.org/2010/01/bugs-users-and-tech-debt/}{indicates} the size of user pool and the convenience for reporting bugs.
Things to avoid: (1) no bug database, (2) a nearly empty bug database.
Example: \url{https://git.launchpad.net/inkscape/diff/src/extension/effect.cpp?id=53578d5ced44808d695e0495d244603a63e6292a}
Example: a not initialized variable can cause problems in a new CPU architecture (ARM v7).
\url{http://git.savannah.gnu.org/cgit/nano.git/commit/?id=7ad232d71470cd8c4dc63aeb02f11c9e8df9ecdb&h=master}
{\tiny
\begin{verbatim}
author Devin Hussey <husseydevin@gmail.com> 2019-03-28 17:28:47 -0400
committer Benno Schulenberg <bensberg@telfort.nl> 2019-03-31 12:57:27 +0200
commit 7ad232d71470cd8c4dc63aeb02f11c9e8df9ecdb (patch)
tree 95aaa66bc0269c68e4ba805821f8883db5ae93ce
parent 85804ec70db060c21df48d5c2861cc39511559de (diff)
download nano-7ad232d71470cd8c4dc63aeb02f11c9e8df9ecdb.tar.gz
files: initialize a variable before referencing it
The lack of initialization caused a nasty bug on some targets (such as
ARMv7) which would make it so that ^S would just say "Cancelled".
While x86 (both 64 and 32 bits) seems to initialize 'response' to zero or
a positive number, ARM does not, and there is usually a negative value in
its place, which triggers the 'if (response < 0)' check and, as a result,
the code says "Cancelled".
This fixes https://savannah.gnu.org/bugs/?56023.
Reported-by: Devin Hussey <husseydevin@gmail.com>
Bug existed since version 4.0, commit 0f9d60a3.
Signed-off-by: Devin Hussey <husseydevin@gmail.com>
Diffstat
-rw-r--r-- src/files.c 2
1 files changed, 1 insertions, 1 deletions
diff --git a/src/files.c b/src/files.c
index 84e3f68..fd54c16 100644
--- a/src/files.c
+++ b/src/files.c
@@ -2101,7 +2101,7 @@ int do_writeout(bool exiting, bool withprompt)
while (TRUE) {
const char *msg;
- int response, choice;
+ int response = 0, choice = 0;
functionptrtype func;
#ifndef NANO_TINY
const char *formatstr, *backupstr;
\end{verbatim}
}
{\bf Communications channels}.
IRC is good.
Try \href{http://lanlab.org/course/2020s/spm/irc-instruction.txt}{IRC}.
However, it turns out that IRC in China is not at all popular. Everyone uses QQ or WeChat, intermixing their work with their life.
Your presence on the list/forum does not imply a commitment to answer all questions or implement all feature requests.
{\bf Developer guidelines}.
For potential contributors.
Basic elements:
\begin{itemize}
\item Pointers to forums.
\item Instructions on how to report bugs and submit patches.
\item Some indication of how development is usually done and how decisions are made — is the project a benevolent dictatorship (veto power), a democracy, or something else.
\end{itemize}
Good examples:
\begin{itemize}
\item \href{https://wiki.documentfoundation.org/Development}{LibreOffice}
\item \href{https://subversion.apache.org/docs/community-guide/}{Apache Subversion}
\item \href{https://www.apache.org/foundation/how-it-works.html}{Apache Foundation - How it Works}
\item \href{https://www.apache.org/foundation/voting.html}{Apache Foundation - Voting}
\end{itemize}
Contrast Developer Guidelines with Developer Documentation.
{\bf Developer documentation}.
Developer guidelines tell programmers how to get along with each
other; developer documentation tells them how to get along with the code itself. Wikis (need to be
actively maintained.)
{\bf Documentation.}
Essential.
People need something to read about your project. Make people's
lives easier. Maintain FAQs (both online and in the distribution). Provide an all-in-one page so that
people can search. Fine to be rudimentary and incomplete at first. The most important documentation for
initial users is the basics: how to quickly set up the software, an overview of how it works,
perhaps some guides to doing common tasks (tutorial). Plain text, HTML, Markdown, {\em
reStructuredText}, \href{https://readthedocs.org}{Read The Docs} (an online documentation tool).
Tell the readers the {\bf known deficiencies}, issues. {\bf Put everything in one page}. See things from the reader's point of view (hard).
{\bf Hosting}.
A website for users and a website for developers (code repo, bug tracker,
development wiki, mailing lists, etc). Two sites link to each other.
Not necessary in the beginning. Use canned hosting instead.
{\bf Choosing a license and applying it}.
What is a license?
A student's answer: it provides protection to my project.
Formal definition: a permit from an authority to own or use something, or do a particular thing.
Free software license (``FSF-approved''), open source license
(``OSI-approved''). The GNU General Public License (GPL v3).
Two kinds of open-source licenses: FSF-approved, OSI-approved. There is a big overlap between the two.
The ``Do Anything'' licenses: MIT-style. Assert nominal copyright and no warranty.
Forbid proprietary programs to use my code: GPL (the GNU General Public License).
GNU Affero GPL. With one extra clause in addition to GPL. For code running in cloud.
How to apply a license? 1. State the license clearly on the project's
front page. 2. Include the license in file LICENSE or COPYING in the
software distribution itself. 3. Include a short notice at the top
of each software source file.
{\tiny
\begin{verbatim}
Copyright (C) <2008, 2009, 2013> <name of author>
# https://www.gnu.org/philosophy/free-sw.html
The freedom to run the program as you wish, for any purpose (freedom 0).
The freedom to study how the program works, and change it so it
does your computing as you wish (freedom 1). Access to the source
code is a precondition for this.
The freedom to redistribute copies so you can help others (freedom 2).
The freedom to distribute copies of your modified versions to
others (freedom 3). By doing this you can give the whole community a
chance to benefit from your changes. Access to the source code is a
precondition for this.
\end{verbatim}
}
{\em Copyleft}. A copyleft license says that the derivative works must grant freedoms described in the parent license. Example: GPL, Affero GPL.
{\em Permissive}. Does not require copyleft (non-copyleft). Example: MIT Licenses, Apache Software License version 2, and BSD license.
License compatibility. Is license A compatible with license B?
Make sure every contributor to the project agrees with the license to be used by collecting Contributor License Agreement from them.
% Developer Certificate of Origin (DCO)
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\foilhead{Good Precedents}
Setup a mailing list - Easy.
Keep discussions on-topic and productive - Hard.
Change of development processes. For example, you have to be more careful about your public image.
Turnovers. New arrivals.
Project stability depends on:
\begin{itemize}
\item Formal policies, written rules - less important. Example: \href{https://ubuntu.com/community/code-of-conduct}{Ubuntu Code of Conduct}, \href{https://askubuntu.com/conduct}{AskUbuntu Code of Conduct}.
\item Collective wisdom developed over time.
\item Intangible, ever-evolving agreements.
\end{itemize}
{\bf Build social norms}.
Healthy turnover won't damage \underline{social norms} because we have regular {\em transmission effort}.
Evidence: songs survive for centuries.
\begin{itemize}
\item {\em What child is this (1865)? Greensleeves} (the 16th-century folk tune).
\item {\em Classic of Poetry} (China's Book of Songs from 1046–771 BC).
\end{itemize}
People instinctively look for \underline{social norms} when they first join a group.
{\bf Avoid private discussions}.
[BAD] A Secret circle of people make {\em all} the Big decisions.
As slow and cumbersome as public discussion can be, it's almost always preferable in the long run.
{\em If there's no reason for it to be private, it should be public.}
Why?
The discussion will help train and educate new developers.
The discussion will train you in the art of explaining technical issues to people who are not as familiar with the software as you are.
The discussion will form archives for future reference.
Bait for smart people.
%There are smart people out there to contribute.
Massive review.
Many ideas.
Slow in the short term. Fast in the long term.
{\bf Zero-tolerance policy toward rudeness}.
It is unfortunately very easy, and all too typical, for constructive
discussions to lapse into destructive flame wars.
It's a short distance from calling someone's technical proposal stupid
to calling the person himself stupid.
``We don't do things that way around here,'' but then move on to the main topic.
Never, ever insist on an acknowledgment, whether public or private, from someone that they behaved inappropriately.
Forget about it and move on.
{\bf Codes of Conduct}.
\href{https://askubuntu.com/conduct}{AskUbuntu Code of Conduct}
\href{https://ubuntu.com/community/code-of-conduct}{Ubuntu Code of Conduct}
\href{https://www.contributor-covenant.org/version/1/4/code-of-conduct}{Contributor Covenant}
It it OK if someone thinks that a code of conduct is not necessary.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\foilhead{Write Everything Down}
Writing is great.
``Reading text is better communication than having meetings.'' -- Zach Holman.
In a distributed work environment, writing everything down is crucial for effective communication.
Why?
People cannot see your face, hear your sound, or read your gesture when you are not not in the same place.
No problem. We could write.
Writing is so powerful that we are still able to read people's thoughts after they are dead for centuries.
For example, books written in 1810, 1859, etc.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\foilhead{Code review}
Commit review.
{\em Peer review} in the open source world.
Benefits:
\begin{itemize}
\item Fostering a productive development community.
\item Improving software quality. Catch bugs before they slip in.
\end{itemize}
Review other people's {\em fresh} code.
Let other people review your {\em fresh} code.
Review means making some timely comments. Ask stupid questions, and ask many.
Do this regularly.
Don't do this after six months.
Look for bugs and areas of possible improvement. Thing we could
catch: memory leaks, off-by-one errors, insufficient comments,
insufficient API documentation, security vulnerabilities, compliments
...
Example of insufficient comments:
{\small
\begin{verbatim}
for item in A.iter(sentence):
return True
return False
\end{verbatim}
}
{\bf Important} to have more eyeballs.
Given enough eyeballs, all bugs are shallow.
Given a large enough beta-tester and co-developer base, almost every problem will be characterized quickly and the fix obvious to someone. -- Eric Steven Raymond, \href{http://www.catb.org/~esr/writings/cathedral-bazaar/cathedral-bazaar/}{The Cathedral and the Bazaar}
Look at other people's code {\em changes as they arrive}.
Why do we focus on reviewing recent changes?
\begin{itemize}
\item It works better socially. Timely feedback for fresh changes. A great way to interact with people. Confirm that what they do {\em matters} (is seen and understood). People do their best work when they know that others will take the
time to evaluate it.
\item The recent change is a good starter for getting familiar with the code base. Also look at the affected callers and callees.
\end{itemize}
Result - better software quality.
The review should be public, so that other people can see it and know that a review has happened, and is expected.
Commit Notifications are useful.
{\tiny
\begin{verbatim}
Branch: refs/heads/master
Home: https://github.com/SYHWY/project_one
Commit: e6873456c6f525ac10633fa660da1b3e8e454394
https://github.com/SYHWY/project_one/commit/e6873456c6f525ac10633fa660da1b3e8e454394
Author: SYHWY <49365180+SYHWY@users.noreply.github.com>
Date: 2019-05-04 (Sat, 04 May 2019)
Changed paths:
M service.py
Log Message:
-----------
add delete method
add delete method for pages
Branch: refs/heads/master
Home: https://github.com/DragonDove/thoth
Commit: 3f5c59c81926bccdfb021f6056f12b4b696e281e
https://github.com/DragonDove/thoth/commit/3f5c59c81926bccdfb021f6056f12b4b696e281e
Author: Dragon Dove <874898731@qq.com>
Date: 2019-05-02 (Thu, 02 May 2019)
Changed paths:
M app.py
M util.py
Log Message:
-----------
Remove unnecessary code, ignore the data in for loop
Branch: refs/heads/master
Home: https://github.com/DragonDove/thoth
Commit: 9b76f235176f403201da3a08d5bcf7f1f01a7e76
https://github.com/DragonDove/thoth/commit/9b76f235176f403201da3a08d5bcf7f1f01a7e76
Author: Dragon Dove <874898731@qq.com>
Date: 2019-05-02 (Thu, 02 May 2019)
Changed paths:
M templates/uploadPage.html
M view.py
Log Message:
-----------
Fix issue, No subject is chosen when uploading
\end{verbatim}
}
A valuable way to spend time.
One could contribute as much to the project by reviewing others'
changes as by writing new code.
Case study. Greg Stein reviewed every line of every single commit
that went into the code repository, and never complained about being
the single reviewer.
Case study. Millions of lines of code and hundreds or thousands of
developers. Each commit (relatively small in size) should reviewed by
sub-domain experts before it is merged to the master branch. Code
review makes such large-scale collaboration possible.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\foilhead{Technical debt}
Like financial debt. It is a debt, and you need to pay it off in the future (with interest).
``When taking {\em short cuts} and delivering code that is not quite right for the programming task of the moment, a development team incurs Technical Debt. This debt decreases productivity. This loss of productivity is the interest of the Technical Debt.''
High technical debt would make the software not maintainable.
https://www.agilealliance.org/introduction-to-the-technical-debt-concept/
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\foilhead{FIXME}
It is a good practice to insert the tag \texttt{FIXME} in your code that needs further attention.
Why? Easy to grep and easy to search.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\foilhead{README}
Use this file to convey Why, What and How.
Treat this file as the project's constitution.
Use this file to avoid feature creep.
%https://ben.balter.com/2017/04/14/your-projects-readme-is-your-project-constitution/
%https://opensource.guide/building-community/#treat-your-README-as-a-constitution
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\foilhead{Be open from day one}
Being open and being closed will affect your ways in
- handling sensitive/confidential data
- wording in code comments
- choosing dependencies
Note: cleaning up needs extra time and decision-making. Also, you don't want all issues in your source code to expose suddenly to the public.
``In the open'' means the following things are accessible by the public in day 1:
- The code repository
- Bug tracker
- Design documents
- User documentation
- Wiki
- Developer discussion forums
Your daily work is visible to the public. Compatible with being open source.
\newpage
``In the open'' does NOT have to mean the following
- allowing strangers to check code into your repository
- allowing anyone to file bug reports in your tracker
- reading and responding to every bug report filed, even if you do allow strangers to file
- responding to every question people ask in the forums
- reviewing every patch or suggestion posted, when doing so may cost valuable development time
\underline{Your source code is open, but your time is not open.}
Pace of engagement.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\foilhead{Opening a formerly closed project}
Like exposing your underwear to the world.
Mechanical difficulties you may encounter:
Your code depends on proprietary, platform-dependent libraries.
Confidential data (e.g., unpublishable comments, passwords or
site-specific configuration information).
Solutions: use open-source libraries, start from \underline{``top-skim''} version.
Managerial issues (1) make sure everyone in the team understand that a BIG change is coming. (2) make sure that you understand how it's going to feel from their point of view. Put yourself in their shoes.
- Embarrassment. Expose code to strangers. What if someone points out flaws in the code publicly.
- Criticisms. Strangers don't know the developers so they can make {\bf bold} comments. But you cannot criticise them (faceless entities).
- Strangers are not aware of business pressures forced on the developers.
- Lots of questions from strangers suggest inadequate documentation.
- Burden of external communications.
Solution:
- Don't worry.
- The above discomfort is perfectly normal.
- Will get better.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\foilhead{Why open source?}
% https://ben.balter.com/2015/11/23/why-open-source/
How does it compare to open access. Paywall.
Europe’s open-access drive escalates as university stand-offs spread. A key driver behind the activity in Europe is the European Commission’s goal that, by 2020, all research will be freely accessible as soon as it is published.
\url{https://www.nature.com/articles/d41586-018-05191-0}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\foilhead{Technical infrastructure}
Brooks' Law - adding manpower to a late software project makes it later.
Communication complexity is proportional to $n^2$.
We need good information management. But don't over-automate. The technical infrastructure gives humans easy ways to apply \underline{care}.
Parliamentary procedure - (Mr. Speaker) keeps some people quiet while others are speaking.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\foilhead{What a project needs}
Web site - better to separate user-facing from developer-facing. Cross-linked. https://www.libreoffice.org/
Mailing lists / Message forums
Version control
% change porting???
Bug tracking
Real-time chat
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\foilhead{Canned hosting}
An online service that offers online collaboration tools needed to run a free software project.
Tools: version control repo, bug tracker, wiki, mailing list.
Advantages: (1) server capacity and bandwidth (2) simplicity.
Disadvantages: limited customisation, no fine-grained control.
If you are not sure you can do better, just use \underline{canned hosting}.
GitHub - https://github.com \href{https://ben.balter.com/2014/11/06/rules-of-communicating-at-github/}{15 rules for communicating at GitHub}
Pull Request, line-by-line commenting.
Mailing lists:
https://discourse.org,
https://groups.google.com (*),
http://groupserver.org/,
mailman http://www.list.org (*), https://mail.python.org/mailman/listinfo/python-dev, https://mail.python.org/mailman/listinfo/flask
Sympa https://www.sympa.org,
dada http://dadamailproject.com
For Mercurial users, check https://en.wikipedia.org/wiki/Comparison\_of\_open\_source\_software\_hosting\_facilities
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\foilhead{Open source hosting}
Should the \underline{hosting itself} be open source?
Fully open source infrastructure: \url{http://phabricator.org}, \url{https://gitlab.com}
Redmine - a flexible project management web application **
As long as you can:
- Interact with project data in automatable ways
- Export the data
It should be fine. Remember: running open-source hosting code in a production environment can be difficult. Why? Multiple servers,
customised networks, dedicated staffs ...
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\foilhead{Anonymity and involvement}
You don't want strangers to push changes into your repo, even they are reviewed.
You don't want a inconvenient \underline{involvement bar} preventing quick comments and easy bug reporting.
Make sure read-only actions, bug filing (with proper anti-spam techniques, such as captchas) are allowed for anonymous, non-logged-in visitors.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\foilhead{Mailing lists / message forums}
A small, focused project - the email gateway features of the bug tracker. Issue Ticket.
A large, complex project - a dedicated discussion forum. Your project should have a \underline{prominently-placed} description of all the available public forums. See page 43 in the text book for an example.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\foilhead{Choosing the Right Forum Management Software}
Both email- and web-based access.
https://mail.vex.net/mailman/listinfo.cgi/alpine
Moderation features.
Rich administrative interface. E.g., handling obsolete email addresses.
Header manipulation.
{\tiny
\begin{verbatim}
From:...
To: <discuss@lists.example.org>
Subject: [Scanley Discuss] Making the 2.5 release
Date:...
Reply-to:...
\end{verbatim}
}
Archiving.
https://mail.python.org/pipermail/python-dev/
SPAM prevention. Use a spam filter.
Purpose:
(1) Avoid your list/forum to be occupied by spam posts.
(2) Avoid your list/forum to be a source of email addresses for spam harvesters.
Measures:
(1) Only auto-allow postings from list subscribers. Non-subscribers' posts go to a {\bf moderation queue}.
(2) Filter posts through spam-detection software, e.g., SPMX, Apache SpamAssassin, SpamProbe.
(3) Moderation. Mailing list moderation
is strictly about keeping the list free of spam, and of wildly off-topic or otherwise inappropriate emails, nothing more. Consider moderation burden.
(4) Email address-hiding in archives. At least obscure the real email address.
jrandom@somedomain.com \\to jrandom\_AT\_somedomain.com \\or to jrandomNOSPAM@somedomain.com.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\foilhead{The great Reply-to debate}
Reply-to: discuss@lists.example.org
What if someone sends a confidential, private message to the author when the author sets Reply-to to the list address?
Accidentally sending a private mail to a public list!
% author, reply-to
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\foilhead{Archiving}
Prompt updating (instantaneous, every hour)
Referential stability (keep the same URL)
Thread support
Searchability
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\foilhead{Browsability}
The project's repository should be browsable on the Web.
Browsability is important because it is a lightweight portal to project data.
Browsability also implies canonical URLs for viewing a particular change -- no ambiguity
during discussion.
% Skipped: Singularity of Information
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\foilhead{Singularity of Information}
TBD.
% Skipped: Authorization
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\foilhead{Commit Notifications, Commit Emails}
Every commit to the repository should generate a notification in a subscribable forum/mailing list.
This notification is generated by the version control system.
Who made the change, when they made it, what files and directories changed, and the actual content of the change.
Include the diff, set ``Reply-to'' to the regular development list.
Let subscribers know what is going on at the code level.
A sense of community.
Commit email list versus Development mailing list.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\foilhead{Bug Tracker}
A bug tracker is more important and more useful that you might think.
A first place to check a project's overall health.
https://savannah.gnu.org/bugs/?53986
https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=908678
A bug tracker can track non-bug information, e.g., new feature requests.
The tracker is as much a public face of the project as the repository, mailing lists or web pages.
Other names: issue trackers, \underline{ticket} trackers, defect trackers, artifact trackers, request trackers.
Bug Triage. Reproduce the bug.
Invalid bug reports and duplicate bug reports will increase the noise to signal ratio.
Regression. Fixed then re-appear.
Bug life cycle.
Bug severity: blocker, critical, major, normal, minor, trivial, enhancement.
Bug importance: highest, high, normal, low, lowest.
Bug state: open, unverified, diagnosed, confirmed, assigned, in progress, resolved (fixed, invalid, wontfix, duplicate worksforme), closed.
It takes considerable time for people to report a bug. Acknowledge each bug report with a timely response.
Interact with email.
Respect anonymity.
How to keep the bug tracker free of junk? Buddy system: ``Did you search the bug tracker to see if it's already been reported?''
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% wed start here
\foilhead{Ticket life cycle}
Someone files the ticket. We got an OPEN ticket.
Others read the ticket, add comments to it, and perhaps ask the original filer for clarification on some points.
The bug gets reproduced.
The bug gets diagnosed. Assign ownership. Set priority.
The ticket gets scheduled for resolution.
The bug gets fixed. The ticket is CLOSED.
Things to notice: not a genuine bug, a duplicate bug.
% This centrality to the life of the project implies a few things about trackers' technical features
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\foilhead{Tracker's interaction with email}
Create new tickets by email.
Add new comments to a ticket by email.
"Subscribe" to a ticket to receive relevant emails.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\foilhead{Pre-filtering the Bug Tracker}
Duplicate or invalid tickets.
Keep the tracker clean by a bug report watcher who \underline{watches} each incoming ticket.
Buddying system. Get confirmation from another guy ({\em buddy}) first before filing the bug report. "Did
you search the bug tracker to see if it's already been reported?"
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\foilhead{Internet Relay Chat}
Or IRC for short.
Real-time chat systems.
Text-based.
Many IRC channels running on an IRC server (e.g., irc.freenode.org).
Channel topic.
Use pastebins (paste sites) for large text or images.
Bots.
Commit notifications in IRC.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\foilhead{Wikis}
https://www.dokuwiki.org/dokuwiki
https://en.wikipedia.org/wiki/Comparison\_of\_wiki\_software
Click and edit.
Clear page organisation strategy. A common vision.
Extensive guidance on how to write new entries. What to avoid. Dispute resolution process.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\foilhead{Q \& A forums}
https://stackoverflow.com
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\foilhead{Social Networking}
Presence on mainstream social media platform.
@AskLibreOffice tweet stream.
%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% \foilhead{Translation infrastructure}
%% https://transifex.com
%% https://translations.launchpad.net
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\foilhead{Social and Political Infrastructure}
How does it work?
Who makes the decisions?
How conflicts are resolved?
What keeps the free software project running, on a day-to-day basis?
Easy answers: meritocracy, cooperation, running code.
Success is \underline{not} only about technical success.
Operational Health: ongoing ability to incorporate new code contributions and new developers, and to be responsive to incoming bug reports.
Survivability: ability to exist independently of any individual participant or sponsor.
Bus Factor.
% Readings on bus factor
% - https://blog.sandglaz.com/increasing-bus-factor-in-project-management/
% - https://pm.stackexchange.com/questions/10434/how-can-a-project-manager-mitigate-the-risks-associated-with-a-low-bus-factor
Institutional permanence achieved by:
\begin{itemize}
\item Formal governance structure and established procedures well followed by participants.
\item Atmosphere of fairness.
\end{itemize}
%meritocracy???
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\foilhead{Fork and Forkability}
Take a copy of the source code and use it to start a competing project, known as a \underline{fork}.
Consequence: no true dictators in free software projects.
Bad decisions would eventually bring about a revolt and a fork.
Hard fork.
Possibility of forks.
Actual forks.
%By fiat, anointed the BD, leadership by a charismatic individual
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\foilhead{Benevolent Dictators}
The person who makes the final decisions.
Personality and Experience.
{\em Reluctance to make decisions}: in most cases, defer to domain experts or area maintainers.
Let other people discuss.
BD - community-approved arbitrator. For example, the founder of a project.
Two things to note: (1) BD usually does not have enough expertise in all areas. (2) Quality developers won't stay if they could not influence the project's direction.
In case of no consensus and most developers want to move on, a BD would say ``This is the way it's going to be.''
Traits of a good BD. (1) Self-restraint. No BD's personal opinions or conclusions in the early discussion so that everyone can speak. (2) Acknowledge his own bad decisions. (3) Does not need to have the sharpest technical skills.
If the project has an obvious, good candidate BD, then that's the way to go. Otherwise, use democracy.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\foilhead{Consensus-based Democracy}
Group-based governance is more ``evolutionarily stable''.
If a group of N people were to give one person with special power, it would mean that N-1 people were each agreeing
to decrease their individual influence. People usually don't want to do that.
Discussion and voting (head count).
Identify key issues.
{\em Honest Broker} who summarizes arguments in a complex discussion.
Approval voting (each voter can vote for as many of the choices on the ballot).
{\bf Arrow's Impossibility Theorem} - no voting system is perfect.
Consensus simply means an agreement that everyone is willing to live with.
Software: https://vote.heliosvoting.org/.
Guidelines: https://www.apache.org/foundation/voting.html
Compromise or vote? Voting ends creative thinking to solve a problem.
Use voting as a last resort.
We should prevent a premature vote. ``I don't think we are ready for a vote yet''. Show hands. Offer a new solution, or a new viewpoint.
Voters do not have to be coders (committers). People who did valuable contributions to the project can be voters, e.g., people who provide legal help, or organize events, or manage the bug tracker, or write documentation.
The decision to add a new voter should be made secretly.
Implicit consensus. Silence means consent.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\foilhead{Polls}
Ask \underline{all} the subscribers of the project's mailing lists to vote, for example, on user interface choice.
Make sure there is a write-in option (a better option not mentioned in the poll questions).
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\foilhead{Vetos}
Veto - a strong objection.
A veto (-1) can halt a hasty or ill-considered change, at least long enough for everyone to discuss it more.
Veto abuse.
Any veto should be accompanied by a thorough explanation.
A veto can be overridden if there is a clear majority for moving on.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\foilhead{Consensus Approval versus Majority Approval}
Consensus approval: at least three binding +1 votes and no vetos.
Majority approval: at least three binding +1 votes and more +1 votes than -1 votes.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\foilhead{Writing It All Down}
At some point, the number of conventions and agreements floating around in your project may become
so great that you need to record it somewhere, linking to mailing list discussions.
Don't try to be comprehensive.
Base the document on the questions that newcomers ask most often, and on the complaints experienced developers make most often.
Make it clear that the rules can be reconsidered.
Good Project Guidelines (from accumulated experience of a lot of open source projects)
https://wiki.documentfoundation.org/Development
https://subversion.apache.org/docs/community-guide/
https://www.apache.org/foundation/how-it-works.html
% erratum: said to
% No punctuation before By the time
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\foilhead{Version control means you can relax}
The change can be reverted.
So we can undo the effects of bad or hasty judgment.
But this does not mean we could abuse reversion.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\foilhead{Joining or creating a non-profit organization}
Tax-exempt. 501(c)(3).
Umbrella organizations.
Software Freedom Conservancy https://sfconservancy.org/
** Apache Software Foundation https://apache.org/
Organizational governance at the Apache Software Foundation has the following {\bf entities}:
\begin{itemize}
\item Board of Directors
\item Project Management Committees
\item Corporate Officers
\end{itemize}
https://www.apache.org/foundation/governance/orgchart
%Eclipse Foundation https://eclipse.org/
%Software in the Public Interest http://spi-inc.org/
%Linux Foundation http://collabprojects.linuxfoundation.org/
The organization is there to handle things the developers don't want to handle.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\foilhead{The Apache Way}
The name Apache came from {\em Native American Apache Nation}.
The foundation's first software - HTTPD Web Server (1995-1999).
Consensus-based, community driven governance.
Project Management Committees have a high degree of freedom.
Communication is done using mailing lists (asynchronously). Voice communication is extremely rare. Why?
Decision-making: ``meritocracy'', ``do-ocracy'' power of those who do: the more you do the more you are allowed to do. Use lazy consensus (silence means no objection). +1, 0 (no opinion), -1 (need to provide an alternative proposal).
Philosophy
\begin{itemize}
\item Collaborative software development
\item Commercial-friendly standard license
\item Consistently high quality software
\item Respectful, honest, technical-based interaction
\item Faithful implementation of standards
\item Security as a mandatory feature
\end{itemize}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\foilhead{ASF Incubator}
Entry point to become a ASF project.
It filters projects on the basis of success likelihood.
Requirements: a working codebase, the intention to assign sufficient intellectual property rights, and a sponsoring ASF member or officer.
\url{http://apache.org/foundation/how-it-works.html#management}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\foilhead{Project Management Committees at the Apache Software Foundation}
The Chair is appointed by the Board.
Daniel Gruno. Apache HTTP Server.
Mladen Turk. Apache Tomcat.
Paul Angus. Apache CloudStack.
Matei Zaharia. Apache Spark.
Josh Thompson. Apache VCL (Virtual Computing Lab).
Vinod Kumar Vavilapalli. Apache Hadoop.
Peter Kovacs. Apache OpenOffice.
\url{http://www.apache.org/foundation/}
Hadoop PMC: \url{http://hadoop.apache.org/who.html}
Manage their projects independently. Quite
autonomous. Lead and oversee the project. Set per-project
policies. Vote on product releases. Elect new
PMC members.
Main role is not code and not coding.
``Ensure balanced and wide scale peer review and collaboration.''
``We worry about any community which centers around a few individuals who are working virtually uncontested.''
{\bf Committers} (elected based on merit) have write access to the project.
PMC chairs report to the board quarterly about the health and status of their project.
Communications. (1) private@list for discussing sensitive topics (e.g., personnel matters or inviting new committers). (2) dev@list for discussing about the future of the project.
All project business is conducted on normal public mailing lists.
\url{https://www.apache.org/foundation/governance/pmcs.html}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\foilhead{Mailing lists}
``The benefit of using mailing lists over private
communication is that it is a shared resource
where others can also learn from common mistakes
and as a community we all grow together.''
\url{http://hadoop.apache.org/who.html}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\foilhead{Review-Then-Commit or Commit-Then-Review}
RTC: change needs consensus approval first.
CTR: make changes at will with the possibility of being retroactively vetoed.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\foilhead{Communications}
Many things to do in a project:
\begin{itemize}
\item Recruit users and developers.
\item Encourage new contributors to become more deeply involved.
\item Allow free-flowing discussion while still reaching necessary decisions.
\item Maintain a body of knowledge and convention that guides newcomers and experts alike.
Hadoop web site - Development - How to contribute
\item Produce working software.
\end{itemize}
The most important skill: \underline{writing clearly}.
Programming skills or communication skills. What matters more?
Is there any correlation between these two sets of skills?
Without good communication skills, how do you convince others to support you? How do you coordinate people to accomplish a complex task.
\underline{Keep your readers' background in mind}
How much knowledge can you assume on the part of the reader when you post an answer in a mailing list?
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\foilhead{You are what you write}
People may never see you in person.
But they can guess about your personality through your writing.
``Your image on the Internet comes from what you write, or what others write about you.''
Is your writing lucid, informative?
Is your writing disorganised, illogical?
\underline{Structure and formatting.} Write in complete sentences, capitalizing the first word of each sentence, and use paragraph breaks where needed. Book to read: Strunk and White. The Elements of Style.
\underline{Email}. Use plain text (not html). {\em Top-post} or quote the relevant portion of the original text first, followed by your response. Stay under 80 columns wide for quoted code or error messages. Write a informative, succinct subject line.
\underline{Content}. Content is the King. Make things easy for your readers. Consider the {\em reader-to-writer ratio}. Don't exaggerate (it can hurt your credibility).
{\tiny
\begin{verbatim}
Disagreement expression 1
-------------------------
Doing it that way would make the code totally unreadable. It'd be a maintenance
nightmare, compared to J. Random's proposal...
disagreement expression 2
-------------------------
That works, but it's less than ideal in terms of readability and maintainability, I think.
J. Random's proposal avoids those problems because it...
\end{verbatim}
}
{\bf Reread and edit}. What you read in articles, newspapers, and books have undergone {\em many} revisions.
\underline{Tone}. Be terse. Terseness dose not mean coldness. Others' feelings matter: unhappy people write worse software. So we should be careful in choosing words.
{\small
\begin{verbatim}
Can you possibly elaborate a bit more on exactly what
problems you ran into, etc?
Also:
What version of Slash are you using? I couldn't tell
from your original message.
Exactly how did you build the apache/mod_perl source?
Did you try the Apache 2.0 patch that was posted about
on slashcode.com?
Shane
\end{verbatim}
}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\foilhead{Recognizing rudeness}
\underline{What is {\bf not} rude?}
Technical criticism. It indicates people are seriously interested in your work.
Straight questions. ``Is your computer plugged in?''
\underline{What {\bf is} rude?}
Failure to provide \underline{quality} criticism can be a kind of insult.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\foilhead{Face}
Use a consistent {\em screen name} everywhere: email address, IRC, repository committer name.
That name is your online ``face''.
{\small
\begin{verbatim}
From: "Karl Fogel" <kfogel@whateverdomain.com>
\end{verbatim}
}
Henk Penning (\texttt{henkp}) and Vadim Gritsenko (\texttt{vgritsenko})
The real name is {\em real}.
{\small
\begin{verbatim}
From: "Wonder Hacker" <wonderhacker@whateverdomain.com>
\end{verbatim}
}
A fantastical online identity never impresses readers. Maybe you're simply insecure.
Use your real name for all interactions.
Use brief signature blocks, or none. A counter example: page 122 in the textbook.
% TBR: Avoiding Common Pitfalls
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\foilhead{Common pitfalls}
\underline{You have to respond to everything.}
{\em Silence is also communication. If you don't know how to answer, answer using silence. - Hui}
A response should have a definite purpose. Think twice before you post (1) what do I want to accomplish? (2) will it not get accomplished unless I say something?
Respond when you see (1) flaws in a proposal (2) miscommunications.
{\bf It's always better to leave people wishing you'd post more than wishing you'd post less.}
\underline{Unproductive threads.} High noise/signal ratio. Bad tone.
{\small
\begin{verbatim}
This discussion is going nowhere. Can we please
drop this topic until someone has a patch to
implement one of these proposals? There's no
reason to keep going around and around saying the
same things. Code speaks louder than words,
folks.
Several proposals have been floated in this
thread, but none have had all the details fleshed
out, at least not enough for an up-or-down
vote. Yet we're also not saying anything new now;
we're just reiterating what has been said
before. So the best thing at this point would
probably be for further posts to contain either a
complete specification for the proposed behavior,
or a patch. Then at least we'd have a definite
action to take (i.e., get consensus on the
specification, or apply and test the patch).
\end{verbatim}
}
\underline{The smaller the topic, the longer the debate.}
{\bf Bikeshed effect}: the amount of discussion is inversely proportional to the complexity of the topic.
{\em Parkinson’s Law of Triviality}
{\em Parkinson shows how you can go in to the board of directors and get approval for building a multi-million or even billion dollar atomic power plant, but if you want to build a bike shed you will be tangled up in endless discussions.}
An atomic plant: so vast, so expensive, and so complicated that people cannot grasp.
A bikeshed: everyone knows about it. No matter how reasonable you are with your proposal, somebody will seize the chance to show
that he is doing his job, that he is paying attention, that he is here.
\underline{The ``Noisy Minority'' effect}. The best way to counteract this effect is to point it out very clearly and provide supporting evidence showing how small the actual number of dissenters is, compared to those in agreement.
\underline{Hawthorne effect}.
\underline{Holy wars}. Find some way to express sympathy and understanding for the points the other side is making.
\underline{Bash competing open source products}. Refrain from giving negative {\em opinions} about competing open source software. One reason: developers overlap.
\underline{Difficult people}. E.g., a filibuster (obstructionist) who keeps claiming that the matter under discussion is not ready for resolution, and offers more and more possible solutions. Purpose behind: to make everyone else take him seriously. How to handle? Better just to tolerate it for a while. Remember: although the other person may be the one behaving destructively, you will be the one who appears destructive if you make a public charge that you can't back up. If you take action on him, collect examples/evidence first.
\newpage
A case study of an excessive poster.
{\tiny
\begin{verbatim}
From: "Brian W. Fitzpatrick" <fitz@collab.net>
To: [... recipient list omitted for anonymity ...]
Subject: The Subversion Energy Sink
Date: Wed, 12 Nov 2003 23:37:47 -0600
In the last 25 days, the top 6 posters to the svn [dev|users] list have
been:
294 kfogel@collab.net
236 "C. Michael Pilato" <cmpilato@collab.net>
220 "J. Random" <jrandom@problematic-poster.com>
176 Branko #ibej <brane@xbc.nu>
130 Philip Martin <philip@codematters.co.uk>
126 Ben Collins-Sussman <sussman@collab.net>
I would say that five of these people are contributing to Subversion
hitting 1.0 in the near future.
I would also say that one of these people is consistently drawing time
and energy from the other 5, not to mention the list as a whole, thus
(albeit unintentionally) slowing the development of Subversion. I did
not do a threaded analysis, but vgrepping my Subversion mail spool tells
me that every mail from this person is responded to at least once by at
least 2 of the other 5 people on the above list.
I think some sort of radical intervention is necessary here, even if we
do scare the aforementioned person away. Niceties and kindness have
already proven to have no effect.
dev@subversion is a mailing list to facilitate development of a version
control system, not a group therapy session.
-Fitz, attempting to wade through three days of svn mail that he let
pile up
\end{verbatim}
}
Developers who do not follow requirements. Acceptance Criteria.
% https://pm.stackexchange.com/questions/27404/what-to-do-with-developers-who-dont-follow-requirements
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\foilhead{Handling growth}
Mailing list (users@, help@, discuss@) - a few thousand users and/or a couple of hundred posts a day.
Imagine Microsoft had a mailing list for Windows.
Strategies: (1) divide into more specific topics. (2) organise information so that it can be easily found.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\foilhead{Conspicuous use of archives}
All communications in an open source project are archived.
Why are archives important? They provide a basis for discussion.
Search the archive first before you ask a question.
To avoid duplication, if a question has already been answered in the archive, refer to it (e.g., include a link to the archive page)
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\foilhead{Treat all resources like archives}
Project information should be at stable, conveniently searchable addresses.
- Direct searchability
- Availability to major Internet search engines
- Browsability
- Referential stability
- Editability
FAQ: (1) in an HTML page (2) a table of contents (3) name anchors for individual anchors (4) easy to edit and to version.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\foilhead{Codify tradition}
Newcomers to a project face a bigger \underline{acculturation burden} because a huge body
of \underline{tradition} has accumulated.
Project norms such as coding standards, communications conventions, and other technical minutae.
Watch for patterns in how people get confused and make a guideline.
The guideline should be easily visible. Formatting of the guideline makes a big difference. http://subversion.apache.org/reporting-issues.html
Use 'r12908' or 'revision 12980' to refer to a revision. 'r12980' is a better referral method.
Consistency means that everywhere people look, they see the same patterns being followed, and start to follow those patterns
themselves.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\foilhead{Choose the right forum}
IRC or development mailing list?
IRC: good for quick response, not good for making big decisions as the sample size is small.
Mailing list: more formal. Every interested party will have an opportunity to see and respond
to the relevant posts, regardless of time zones, schedules.
Switch from the narrow forum (e.g., bug/ticket trackers) to a broader forum for forum appropriateness.
Cross-link between the old forum and the new forum. Open source is fundamentally a \underline{writer-responsible} culture.
Paste important summaries and/or conclusions from the list discussion back to the ticket.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\foilhead{Announcing releases and other major events}
Where? Front page (brief synopsis), News or Press Releases (details) of your project's website. Twitter handles. RSS feeds. Forums. Mailing list (announce@yourprojectdomain.org).
Make the announcements in all these places at the same time, as nearly as possible.
For a less important event (e.g., next release date), use a daily mailing lists (not the announce list).
{\tiny
\begin{verbatim}
Just a progress update: we're planning to release version 2.0 of Scanley in mid-August 2005.
You can always check http://www.scanley.org/status.html for updates.
The major new feature will be regular-expression searches.
Other new features include: ... There will also be various bug fixes, including: ...
\end{verbatim}
}
%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% \foilhead{Announcing security vulnerabilities}
%% Basic guidelines: (1) Don't talk about the bug publicly until a fix is available; then supply the fix at the same time you an-
%% nounce the bug. (2) Come up with that fix as fast as you can.
%% \begin{itemize}
%% \item Receive the report. A seperate mailing list or contact form for receiving security bug reports. Only ``trusted developers'' can read them. Make sure the submission is secure (encripted using https or GPG [Gnu Privacy Guard] or PGP [Pretty Good Privacy]).
%% \item Develop the fix quietly. Evaluate severity and urgency. How serious is the vulnerability? How easy is it to exploit the vulnerability? Who reported the problem to you? A developer. \texttt{anonymous14@globalhackerz.net}. A security professional. What's the deadline for making the bug public (go-public date)? \underline{Do not commit the fix to any public repository.}
%% % exam: if a security bug report comes from one of your team members, then you don't have to fix the bug promptly.
%% \item CVE (Common Vulnerabilities and Exposures) numbers. "CVE-2014-0160". https://cve.mitre.org/cgi-bin/cvename.cgi?name=2014-0160
%% \end{itemize}
%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% \foilhead{Common Vulnerability Scoring System}
%% CVSS is developed by the \underline{National Vulnerability Database} at the U.S. National Institute of Standards (NIST).
%% Assign a score to severity of vulnerability.
%% https://nvd.nist.gov/
%% {\tiny
%% \begin{verbatim}
%% CVSS v2.0 Ratings CVSS v3.0 Ratings
%% Severity Base Score Range Severity Base Score Range
%% None 0.0
%% Low 0.0-3.9 Low 0.1-3.9
%% Medium 4.0-6.9 Medium 4.0-6.9
%% High 7.0-10.0 High 7.0-8.9
%% Critical 9.0-10.0
%% \end{verbatim}
%% }
%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% \foilhead{Pre-notification}
%% Once a fix is ready, who should be notified first, average users or well-known online services?
%% \underline{Pre-notification} simply means contacting those administrators privately before the go-public date, telling
%% them of the vulnerability and how to fix it.
%% The qualification for receiving pre-notification: (1) the recipient must run a large, important service where
%% a compromise would be a serious matter. (2) the recipient must not leak the security problem before the go-public date. (3) Secure communication.
%% If use email, send the pre-notification individually. What would happen if we send it to all recipients at once?
%% \newpage
%% {\tiny
%% \begin{verbatim}
%% From: Your Name Here
%% To: admin@large-famous-server.com
%% Reply-to: Your Name Here (not the security list's address)
%% Subject: Confidential important notification.
%% [[[ BEGIN ENCRYPTED AND DIGITALLY-SIGNED MAIL ]]]
%% This email is a confidential pre-notification of a security alert
%% in the Scanley server software.
%% Please *do not forward* any part of this mail to anyone. The public
%% announcement is not until May 19th, and we'd like to keep the
%% information embargoed until then.
%% You are receiving this mail because (we think) you run a Scanley
%% server, and would want to have it patched before this security hole is
%% made public on May 19th.
%% References:
%% ===========
%% CVE-2017-892346: Scanley stack overflow in queries
%% Vulnerability:
%% ==============
%% The server can be made to run arbitrary commands if the server's
%% locale is misconfigured and the client sends a malformed query.
%% Severity:
%% =========
%% CVSSv2 Base Score: 9.0
%% CVSSv2 Base Vector: AV:N/AC:L/Au:N/C:C/I:C/A:C
%% (See https://nvd.nist.gov/CVSS/Vector-v2.aspx for how to
%% interpret these expressions.)
%% Workarounds:
%% ============
%% Setting the 'natural-language-processing' option to 'off' in
%% scanley.conf closes this vulnerability.
%% Patch:
%% ======
%% The patch below applies to Scanley 3.0, 3.1, and 3.2.
%% A new public release (Scanley 3.2.1) will be made on or just before
%% May 19th, so that it is available at the same time as this
%% vulnerability is made public. You can patch now, or just wait for
%% the public release. The only difference between 3.2 and 3.2.1 will
%% be this patch.
%% [...patch goes here...]
%% \end{verbatim}
%% }
%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% \foilhead{Distribute the fix publicly}
%% In a single, comprehensive announcement, you should describe the problem, give the CVE number if any, describe how to work around it, and how to permanently fix it.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\foilhead{Packaging, Releasing, and Daily Development}
Open source: release and development are in parallel.
What does a new release mean? bug fixed. new bugs introduced. new features added. incompatible changes introduced (e.g., data formats).
Release numbering. Most important for people who don't follow the project on a daily basis. be consistent.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\foilhead{Release number components}
Release numbers are groups of digits separated by dots. For example, Singer 5.11.4.
There is no limit to the number of components, but most projects do not go beyond three or four.
Descriptive label, e.g., Singer 5.11.4 (Beta). Other qualifiers, Stable, Unstable, Development, RC (Release Candidate).
a.b.c - a is major number, b is minor number, and c is micro (patch) number. Increments in the micro number are essentially for bug fixes only. Increments in the major are for big changes, new features. An parity (even/odd) of the minor number indicates the stability.
a.b.c.d - d is called build number (incremented every time the software is built).
0.1, 0.2, 0.3 - initial development
%?? leeway
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\foilhead{Release branch}
A release branch is just a branch in the version control system (see branch), on which the code destined for this release can be isolated from mainline development.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\foilhead{Packaging}
The point of the source package is to unambiguously define the release.
scanley-2.5.0.tar.gz (for Unix-like systems)
scanley-2.5.0.zip (for Windows)
\newpage
\begin{verbatim}
$ ./configure
$ make
# make install
\end{verbatim}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\foilhead{Candidate releases}
Many projects prefer to put out release candidates first. Why?
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\foilhead{Signatures and checksums for package tarballs}
scanley-2.5.0.tar.gz
scanley-2.5.0.tar.gz.asc
scanley-2.5.0.tar.gz.md5 (scanley-2.5.0.tar.gz.sha256)
md5sum
\begin{center}
\includegraphics[width=0.60\textwidth]{fig/CPT-Hashing-File-Transmission.png}
\end{center}
(from wikipedia)
A signature is created using the private key of the signer. The signature is verified using the corresponding public key.
emacs-26.1.tar.xz.sig
{\tiny
\begin{verbatim}
-----BEGIN PGP SIGNATURE-----
iQEzBAABCAAdFiEE1AWqLIYsVPF+7mvg6LzXhmr8+XgFAlsL9voACgkQ6LzXhmr8
+Xiv8gf+KwpUcTcrDYW+wcOpn0VtpCVrYZQUoz9WWD0N3zDmlNfk+O+tV9q0vEWF
gD6aiflkGJ0hM16tV7kqlAkeM6CrZqnfgaVoJFrLQhjaEv9qm1g8Bb21RgZMeZOp
W+Zoojk9a9UipLlLvfMR9tDP9CEXFls7sXgBpPFiMiQLsKn2B2cv9mkHUp4mfM3t
J6OISfrdgPSX1QtIe6zZlhJjmIgK1vA7I4Ce4CDuY9HmuqiZowq2h0Vwbcw5AEsa
5greYvtX+I2f6Uxppm6fdiS2rFaVNm5zTqH1bPvKxLZKlQs9WokJ3lOG/xgH1Wrj
5pIdAsIIS7wHaqj4jOwDA4IDjoNyVw==
=fILP
-----END PGP SIGNATURE-----
\end{verbatim}
}
{\tiny
\begin{verbatim}
alice% gpg --output doc.sig --detach-sig doc
You need a passphrase to unlock the secret key for
user: "Alice (Judge) <alice@cyb.org>"
1024-bit DSA key, ID BB7576AC, created 1999-06-04
Enter passphrase:
blake% gpg --verify doc.sig doc
gpg: Signature made Fri Jun 4 12:38:46 1999 CDT using DSA key ID BB7576AC
gpg: Good signature from "Alice (Judge) <alice@cyb.org>"
\end{verbatim}
}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\foilhead{Managing Participants}
Community and motivation.
Humans have a {\em built-in desire} to work with other humans, and to {\em give and earn respect} through cooperative activities.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\foilhead{Create constructive atmosphere in the community}
\underline{Delegation}. Ask someone else to take on the task. Purpose: not just about getting individual tasks done, but also drawing people into a closer commitment to the project.
Make the assignment of a task (ticket) in the form of an inquiry.
{\tiny
\begin{verbatim}
Assigning this over to you, jrandom, because you're most familiar with this code. Feel
free to bounce this back if you don't have time to look at it, though. (And let me know
if you'd prefer not to receive such requests in the future.)
\end{verbatim}
}
\underline{Follow up after you delegate}.
\underline{Notice what people are interested in}. The more aware you are of what different people want out of the project, the more effectively you can make requests of them. Demonstrating an understanding of what they want in itself is useful.
\underline{Praise and criticism}. Both show attention. Be specific rather than generic. Both can be diluted by inflation. Detailed, dispassionate criticism is often taken as a kind of praise. Most people respond pretty well to criticism that is specific,
detailed, and contains a clear (even if unspoken) expectation of improvement.
\underline{Prevent territoriality}. When people sense a "no trespassing" sign, they stay away. For example, author names.
\underline{The automation ratio}.
\underline{Automated testing}. Regression testing, regression test suite, regression. Unit testing, a unit test suite.
% skip: Treat Every User as a Potential Participant
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\foilhead{Share management tasks}
"Manager" does not mean "owner". {\em Responsibility without monopoly}. What should we do in case of conflict: two or more people want the same role?
Patch manager. Translation manager. Documentation manager. Issue manager.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\foilhead{Transitions}
Personal circumstances can change.
{\tiny
\begin{verbatim}
> If you wish to replace me with some one else, I will gracefully
> pass on the role to who comes next. I have one request, which
> I hope is not unreasonable. I would like to attempt one more
> release in an effort to prove myself.
I totally understand the desire (been there myself!), but in
this case, we shouldn't do the "one more try" thing.
This isn't the first or second release, it's the sixth or
seventh... And for all of those, I know you've been dissatisfied
with the results too (because we've talked about it before). So
we've effectively already been down the one-more-try route.
Eventually, one of the tries has to be the last one... I think
[this past release] should be it.
\end{verbatim}
}
The most important factor in asking someone to step down is privacy: giving him the space to make a
decision without feeling like others are watching and waiting.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\foilhead{Committers}
A committer is someone who has commit access: the right to \underline{make changes} to the copy of the code that will be used for the project's next official release.
A committer has the ability to put changes into the {\em master} copy.
There are always many people who feel competent to make changes to a program, and some smaller number who actually are.
How to choose a committer? The Hippocratic Principle: {\em first, do no harm}. Good judgment. Good personality.
If you have 100 committers, 12 of whom make large changes on a regular basis, and the other 88 of whom just fix typos and small bugs a few times a year, that's still better than having only the 12.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\foilhead{Credit}
Credit is the primary currency of the free software world.
Participation in an open source project can indirectly have monetary value, because many employers now look for it on resumés.
When small contributions are acknowledged, people come back to do more.
Keep accurate records of who did what (be specific), when.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\foilhead{Forks}
"Social forks" versus "short forks (hard forks)".
\underline{Handling a fork}. A social fork is not necessarily a bad thing (e.g., GCC/EGCS fork). Keep calm and remember your long-term goals. Don't remove someone's commit access in your project just because she decided to work on the fork.
\underline{Initiating a fork}. {\em Most forks do not succeed, and most projects are not happy to be forked}. Take all factors into account in evaluating the potential success of your fork. Line up support privately first, then announce the fork in a non-hostile tone. Granting all committers of the original project commit access to the fork, including even those who openly disagreed with the need for a fork.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\foilhead{User satisfaction}
TBD.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\foilhead{Master branch gatekeeper}
TBD.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\foilhead{Epics and story points}
Sprints.
Timeboxes.
TBD.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\foilhead{The Economics of Open Source}
Software developers must be paid.
Office space and network bandwidth.
Proprietary software: monopoly-controlled royalty streams based on per-copy sales.
Imagine something that everyone needs but no one needs to own.
For example, a company needs a web server, but it does not want to make money from it. Maintainance is also a burden.
- Paid developers: informal subsidy, salaries.
- Unpaid developers
In-group and out-group developers.
Unpaid labor for someone else's benefit.
- Funding sources
Money -- hire good programmers -- influence -- voting power -- voting block.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\foilhead{Forces of Chaos}
A key developer suddenly loses interest.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\foilhead{Corporate Involvement}
Sharing the burden. Reduce cost of development incurred on individual companies without sacrificing the benefits.
Ensuring maintenance of infrastructure. Companies sell services dependent on open source software.
Establishing a standard. Include the standard into open source software to make it popular. If the standard becomes popular, the company becomes profitable.
Creating an ecosystem.
Supporting hardware sales. Hardware is useless without good software, vice versa.
Undermining a competitor.
Marketing. Brand marketing.
Proprietary relicensing. Resell open source software by integrating it to proprietary software. Not a "pure open source play". "Open source is just a way of software development" to "open source is a way of life" spectrum.
Start the project or join in the project?
Leadship or just one voice?
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\foilhead{Government Projects}
Elected officials.
Publicity events.
Exposure event.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\foilhead{Be Asynchronous}
Wikipedia versus Encyclopedia Britannica.
Distributed workflows.
%https://ben.balter.com/2020/03/18/tips-for-working-remotely/
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\foilhead{The Zone}
Do not interrupt a deep worker when they are in The Zone.
Why?
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\foilhead{Fail Fast}
TBA.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\foilhead{The Kanban Method}
Taiichi Ohno.
Introduced in 1940s, 1959??? by Toyota.
A great view of the status of the project.
Immediately know who is doing what by just looking at the board.
Each task is represented by a card.
Each movable card can be in one of {\em phases}: Backlog, Work in Progress (WIP) and Done.
Usually, as the work progresses, you shift the card rightward.
For software development, we could have Backlog (requirements), Develop, Test, Documentation, Done.
Priority. Order cards in each phase by their importance.
Start with what you are doing now.
WIP limit. Don't overwhelm the developer by too many tasks (multitasking).
Definition of Done or Done Rule.
Lead time: time between task creation and completion. Visible to customers.
Cycle time: time between task start and completion. Visible to employees.
Burn up diagram (Cumulative Flow Diagram).
Burn down diagram.
Pull work instead of Push work.
One color for each team member. Great!
Good Kanban software: \href{https://kanboard.org/}{Kanboard}.
\end{document}
|