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
|
<html><head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width,initial-scale=1">
<meta name="theme-color" content="#000000">
<title>Chrisoft::Blog</title>
<script type="text/javascript" src="/panel.js"></script>
<script type="text/javascript" src="/blog/footnoter.js"></script>
<script type="text/javascript" src="/blog/aes-js.js"></script>
<script type="text/javascript" src="/blog/scrypt.js"></script>
<script type="text/javascript" src="/blog/sha256.js"></script>
<script type="text/javascript" src="/blog/decryptor.js"></script>
<link rel="stylesheet" type="text/css" href="/common.css">
<link rel="stylesheet" type="text/css" href="/panel.css">
<link rel="stylesheet" type="text/css" href="/theme0a.css" id="theme0a">
<link rel="stylesheet" type="text/css" href="/theme0b.css" id="theme0b">
<link rel="stylesheet" type="text/css" href="/theme1a.css" id="theme1a">
<link rel="stylesheet" type="text/css" href="/theme1b.css" id="theme1b">
<link rel="stylesheet" type="text/css" href="/theme2a.css" id="theme2a">
<link rel="stylesheet" type="text/css" href="/theme2b.css" id="theme2b">
<link rel="stylesheet" type="text/css" href="/theme3a.css" id="theme3a">
<link rel="stylesheet" type="text/css" href="/theme3b.css" id="theme3b">
<link rel="stylesheet" type="text/css" href="/blog/blogext.css">
<script>
function ol()
{
window.onresize=function()
{
if(window.innerWidth<768)
setupevents();
else unsetevents();
}
window.onresize();
_decryptonload();
}
function loadTheme(){
var thm=document.cookie.replace(new RegExp("(?:(?:^|.*;\\s*)thm\\s*\\=\\s*([^;]*).*$)|^.*$"),"$1");
if(thm.length<2||'0123z'.indexOf(thm[0])==-1||'abz'.indexOf(thm[1])==-1)thm='zz';
var ent="";
var d=new Date();
if(thm[0]=='z')
{
var m=d.getMonth()+1;
if(m>=3&&m<6)thm='0'+thm[1];
else if(m>=6&&m<9)thm='1'+thm[1];
else if(m>=9&&m<12)thm='2'+thm[1];
else thm='3'+thm[1];
}
if(thm[1]=='z')
{if(d.getHours()>=18||d.getHours()<6)thm=thm[0]+'b';else thm=thm[0]+'a';}
ent=`theme${thm}`;
var R=new RegExp('theme[0-4][ab]');
for(var i=0;i<document.styleSheets.length;++i)
{
if(R.exec(document.styleSheets[i].ownerNode.id)!==null&&document.styleSheets[i].ownerNode.id!=ent)
document.styleSheets[i].disabled=true;
else document.styleSheets[i].disabled=false;
}
var thmcolor="";
switch(thm[0])
{
case '0':thmcolor=thm[1]=='a'?'#f59dda':'#2f0933';break;
case '1':thmcolor=thm[1]=='a'?'#9df59d':'#090933';break;
case '2':thmcolor=thm[1]=='a'?'#edb47b':'#1f1205';break;
case '3':thmcolor=thm[1]=='a'?'#a0cdfa':'#051933';break;
}
document.querySelector("meta[name=theme-color]").setAttribute('content',thmcolor);
}
loadTheme();
</script>
</head>
<body onload="ol()" style="overflow-x:hidden;">
<div id="panel" class="TText">
<ul id="panellist">
<li><a href="/"><h1>Chrisoft</h1></a></li>
<li><a href="/blog"><h2>Blog</h2></a></li>
<li><a href="#"><h3 id="title">Software Project Management in the Free Software World</h3></a></li>
<li><span>Tags</span>
<ul id="tagslist">
<li><a href="/blog/list/sophistry/">sophistry</a></li></ul>
</li>
<li id="tocouter">
<span>Table of Contents</span>
<ul id="tocroot">
<li><a class="toctarg" href="#tocanch0">Project charter. What?</a></li><li><a class="toctarg" href="#tocanch1">Tools and outdated approaches</a></li><li><a class="toctarg" href="#tocanch2">Free software that is...</a></li></ul>
</li>
<li style="margin-left:-0.5em"><a id="prevp" href="2018-05-18.html">Prev post</a></li>
<li style="margin-left:-0.5em"><a id="nextp" href="2018-06-07.html">Next post</a></li>
</ul>
</div>
<div id="content">
<h2 id="titleh" class="TText" style="font-wight:normal;">Software Project Management in the Free Software World</h2>
<div id="datetags" class="TText" style="margin-bottom:1em;">2018-06-05<br>#sophistry</div>
<hr><div id="article" class="TText"><article>
<p>
This article is based on a presentation project I did for the software
project management course. The original presentation can be found
<a href="//filestorage.chrisoft.org/blog/data/ventriloquist.pdf">here</a><a id="n1" href="#note1" class="note">[1]</a>.
</p>
<p>
As mentioned in <a href="https://chrisoft.org/blog/post/2018-05-18.html#tocanch4">
another article</a>, software engineering college
in China (one of which I am currently studying in) mainly deals with
the development cycle of proprietary programs with a very specific purpose
(i.e. enterprise software), such as software system for a library or an
electric grid. Unfortunately, there are very few instances of free
enterprise software in the wild. Therefore it's safe to assume that I still
know nothing about the life cycle of a free software project except my own
experience.
</p>
<h2 id="tocanch0" class="tvis">Project charter. What?</h2>
<p>
Approximately 50% of the class is focused on the project charter. How the
charter is issued. Why modifying the charter is vital when the client requests
to make a change in the requirements. This list can go a lot longer.
</p>
<p>
However, project charter doesn't seem to play an important role in free software
projects, at least compared to what I have learned. Even some <i>huge</i> free
software projects such as KDE omits the project charter. Instead they have brief
description of every sub-projects and use their 'philosophy' to govern the whole
project.
</p>
<p>
This can lead to problems though. When decisions need to be made, the only ones
involved are the current maintainers. Free software projects fall into roughly
four categories according to the way new features are introduced:
</p>
<ul>
<li>Linux kernel/LineageOS: developers submits changes, got reviewed, and
possibly merged.
<p>Linux kernel is such a huge and complex project that probably only users
extremely familiar with it know what new functionality they need. Also
the code needs to have a reasonable wide range of use cases to be merged.
This sets a pretty high standard for the contributors. LineageOS, on the
other hand, is a lot easier to get started. However being mostly a community
project, they cannot simply get every requested features implemented without
help.</p>
</li>
<li>i3wm: this will never turn into compiz.
<p>It is important for i3wm not to turn into compiz. However sometimes this
can be abused for dictatorship over the project (e.g. gogs, which resulted
in a fork into gitea.<a id="n2" href="#note2" class="note">[2]</a>)</p>
</li>
<li>systemd: let's add a email client to this.
<p><s>j/k.</s></p>
</li>
<li><a href="#tocanch2">...</a></li>
</ul>
<h2 id="tocanch1" class="tvis">Tools and outdated approaches</h2>
<p>
Over the years, the process of building a commercial software has evolved a
lot. However, the process of building free software seem to be stuck at what
it was like in the 70s forever: (nearly) everything is still on mailing lists.
Indeed, VCS, issue tracker and CI simplified a lot of stuff. And the
infrastructure has also improved a lot from that of the 70s. But we are still
no where close to a well-organized process. Personnel management is almost
completely relying on faith. Deadlines can be pushed back again and again.
That's it.
</p>
<h2 id="tocanch2" class="tvis">Free software that is...</h2>
<p>... developed as if it was proprietary software.</p>
<p>
A very typical instance: Android. Repositories are not updated until new
release comes out. Many related patents are held by Google. Even codename
needs revealing.
</p>
<p>
Another (less-known) example is Deepin, which one of my friends works for.
It's infra is far less open to public than that of Debian or even Ubuntu.
Public opinions are ignored from time to time.
</p>
<p>
While making the project much more better-organized, this approach
automatically makes the project dictated by the project management team.
Many benefits of free software doesn't apply to such projects, which
makes them closer to those 'shared source' software. Although still can be
forked freely, most forks die out pretty quickly, as these projects tend
to be pretty large in scale, maintenance of such a project is no trivial task.
</p>
<p>
This is certainly not the best way to do it.
</p>
</article>
<!--
vim: syntax=html spell spelllang=en_us
-->
</div><br><hr>
<div class="TText" id="notediv" style="font-size:80%;"><span class="TText"><a id="note1" href="#n1">[1]</a>: I used the term
"open source" in the original
presentation, which is more familiar to the audience. But the actual focus
is the free software world.<br></span><span class="TText"><a id="note2" href="#n2">[2]</a>: The maintainer of gogs is <br></span></div>
<div id="insanch" style="height:3em;"></div>
<div id="footer" style="">
<div id="pagesw" class="TText" style="width:100%;height:0.5em;"></div>
<div style="text-align:center;" class="TText">
Proudly powered by SSBS <reduced style="font-size:70%;">(the static stupid blogging system)</reduced> 2.5
<br>
Content licensed under CC BY-SA 4.0. <span id="purgep" style="display:none;font-size:70%;">This page has passphrase(s) stored. Click <a href="javascript:_purgep()">here</a> to purge.</span>
</div>
</div>
<div id="cmdbuf" class="TText" style="transition:500ms;padding:1em;font-size:2em;color:white;position:absolute;background-color:rgba(0,0,0,0.6);left:50%;top:50%;transform:translate(-50%,-50%);pointer-events:none;opacity:0;">
</div>
</div>
<div id="decryptui" style="display:none;opacity:0;color:white;z-index:1000;position:fixed;left:0;top:0;width:100%;height:100%;background-color:rgba(0,0,0,0.4);transition:opacity 0.5s;">
<div id="decryptdlg" class="TText" style="padding:10px 20px;position:absolute;left:50%;top:50%;transform:translate(-50%,-50%);background-color:rgba(0,0,0,0.6);">
<div id="keyhint" style="margin-bottom:8px;"></div>
<div style="margin-bottom:8px;">Key: <input id="keyinp" type="text" style="color:#fff;"></div>
<div style="height:2.25em;">
<button id="btndecrypt" onclick="decryptor(decid,document.getElementById('keyinp').value);" style="position:absolute;left:20px;">Decrypt</button>
<button onclick="hidedecryptui();" style="position:absolute;right:20px;">Cancel</button>
</div>
</div>
</div></body></html>
|