ssm-en.xhtml
branchv_0
changeset 0 b0e72d76cccf
child 1 83f6bf9077c5
equal deleted inserted replaced
-1:000000000000 0:b0e72d76cccf
       
     1 <?xml version="1.0" encoding="UTF-8"?>
       
     2 <!DOCTYPE html SYSTEM "http://www.w3.org/2002/04/xhtml-math-svg/xhtml-math-svg-flat.dtd">
       
     3 <html xmlns="http://www.w3.org/1999/xhtml">
       
     4 	<head>
       
     5 		<title>Sane Software Manifesto</title>
       
     6 		<link href="style.css" 	type="text/css" rel="StyleSheet" />
       
     7 	</head>
       
     8 	<body>
       
     9 		<h1>Sane Software Manifesto</h1>
       
    10 		
       
    11 		
       
    12 		<p>In respect to user freedoms, privacy, liberty, quality, mental health and world peace we create software according to these guidelines.</p>
       
    13 
       
    14 
       
    15 		<h2>free software</h2>
       
    16 		
       
    17 		user has freedoms
       
    18 		user controls his/her computer and software
       
    19 		non-free software can not be trusted 
       
    20 		must be buildable using free software toolchain (like GNU/Linux + GNU GCC or OpenJDK etc.)
       
    21 		should not promote non-free (proprietary) software or services
       
    22 		copyleft licenses (like GNU GPL or GNU Affero GPL) are recommended because they guarantee software freedoms to every single end-user and prevent possibility that freedom vanishes somewhere in the distribution chain a user can't benefit from the free software albeit the software is build on originally free source code
       
    23 
       
    24 		<h2>documented</h2>
       
    25 	at least basic documentation must be released under a free license (GNU FDL is recommended)
       
    26 	there might be also other documentation/books released under any license and price
       
    27 	but average software engineer must be able to build and operate the software with just basic free documentation
       
    28 		there must be a free documentation describing building and running of the software on a fresh operating system installation including description of all dependencies
       
    29 	documentation should focus on all target groups: users, administrators, developers
       
    30 	there must be a big picture and software architercure described
       
    31 	
       
    32 		<h2>semantic versioning</h2>
       
    33 	strongly recommended
       
    34 	required when the package is suposed to be used as dependency by others
       
    35 	if there is need of some marketing or cool versioning/codenames like Ultrasonic Umbrella or 2016, they should be used in addition to semantic versioning, not instead it
       
    36 	once publicly released, the package must not be changed anymore – if a change (even small fix) is needed, new version number must be assigned
       
    37 	APIs, file formats and protocols might be semanticly versioned independently from the implementation
       
    38 		in such case, there should be a table documenting which API/format/protocol version matches which implementation version
       
    39 
       
    40 		<h2>compatibilible with itself</h2>
       
    41 	focus on backward compatibility
       
    42 	don't broke things
       
    43 	incompatible changes must be planned and announced in advance
       
    44 	upgrade scripts + upgrade documentation
       
    45 
       
    46 		<h2>compatibilible with others</h2>
       
    47 	use open standards (protocols, formats) if they exist
       
    48 	define own open standards if needed
       
    49 		also standards must be semantically versioned
       
    50 		should be written in machine readable format (WSDL, WADL, ASN.1, XSD, Diameter dictionary etc.) or at least formal language (Backus–Naur Form, EBNF etc.)
       
    51 		also configuration should have machine readable description and should be testable by executing a command
       
    52 
       
    53 		<h2>modular architecture</h2>
       
    54 	larger and multi-purpose software should be divided into smaller modules
       
    55 	modules must have defined dependencies (less = better)
       
    56 	particular modules should be compilable and executable separately
       
    57 	whole system should be compilable with only selected modules – must not require compilation or even distribution of all modules, if they are not necessary
       
    58 
       
    59 		<h2>extensible</h2>
       
    60 	able to be extended
       
    61 		by configuration (RegExp, SQL, XSLT, XPath etc.)
       
    62 		by scripting (Guile, ECMA Script etc.)
       
    63 		and/or third-party plugins/modules
       
    64 			it should be easy to create a third-party module and plug it in an existing system
       
    65 			dependencies needed to write an extension (i.e. header files, API classes/interfaces) should be as small as possible (do not require large codebase to write an extension)
       
    66 	there should be public directory of extensions/scripts
       
    67 
       
    68 		<h2>testable</h2>
       
    69 	there should be automated build-time complex tests for the package – feed the program with sample input and verify expected output
       
    70 	there should be also automated runtime/postinstall tests – in order to verify that software was installed properly, all required dependencies are met and basic function is guaranteed – the program should report problem during its start (as a warning if it is not fatal), instead of unexpected failures during operation
       
    71 	unit tests are recommended for code parts that are internally complex (algorithms, important business logic) and have simple interfaces
       
    72 
       
    73 		<h2>safe code and sustainability</h2>
       
    74 	correctness, safety and readability is prefered to performance
       
    75 	use strong data typing, declare preconditions and possible exceptions
       
    76 	data structures must be known and well documented – don't use undocumented map keys or properties
       
    77 	code, comments and analysis should be written in the same natural language
       
    78 	there should be a dictionary of used terms, so whole team and also users and customers will speak same language
       
    79 
       
    80 		<h2>small code footprint</h2>
       
    81 	less LOC (resp. complexity) = better
       
    82 	reduce boilerplate and unused code
       
    83 	use code generators (during build process, not to generate code to be manually edited and versioned)
       
    84 
       
    85 		<h2>sane dependencies</h2>
       
    86 	avoid NIH and reuse code but also avoid dependency hell
       
    87 	know your dependencies, know why they are required
       
    88 	reduce dependencies to only necessary ones
       
    89 	depend on small and useful libraries – not on bulky application packages
       
    90 	if dependency on bulky application package is inevitable, add a layer of abstraction – create a generic interface and connector and allow others to replace the bulky package with their own sane implementation
       
    91 	helper tools:
       
    92 		if you e.g. use Bash and Perl during the build process, don't add also Python dependency, write it in Perl – or use Python instead of Perl.
       
    93 		Or if you use Java as your main language, consider not using Python/Perl for scripting and use Java for it
       
    94 	if possible, always depend on abstract interfaces, not on particular implementations
       
    95 
       
    96 		<h2>easily auditable</h2>
       
    97 	small code footprint and minimal dependencies makes it easy to do security audit
       
    98 	avoid ungrounded refactoring and reformatting – they make mess and noise in the version control system and impede the audit
       
    99 	refactoring/reformatting changesets should be separated from substantive changes
       
   100 
       
   101 		<h2>reproducible builds</h2>
       
   102 	builds should be reproducible: same code/version → same binary package
       
   103 	if not, it should be documented, why and how build products mihgt differ, and there should be plan/task to make it reproducible
       
   104 
       
   105 		<h2>trustworthy packages and sources</h2>
       
   106 	every released version (binary or source) is cryptographically signed by the authors (GnuPG/OpenPGP is strongly recommended)
       
   107 	if HTTP is supported, HTTPS should also be – the attacker/eavesdropper should not even know what software/package/update is downloaded by the user
       
   108 	the attacker should not be able to suppress updates – the program must not be silent in such case and must warn the user that something possibly nasty and dangerous is happening 
       
   109 	releases should be downloadable also (or exclusively) over BitTorrent or other P2P network
       
   110 	there should be also checksums/hashes for every package
       
   111 	source code repository is accessible through an encrypted connection
       
   112 
       
   113 		<h2>network interactions</h2>
       
   114 	no network connection is needed during build – build must be possible completely offline, all dependencies must be downloadable and documented including secure hashes or better cryptographic signatures
       
   115 	if dependencies are optionally automatically downloaded during/before build, the packaging system must cryptographically verify that that they are undamaged
       
   116 	avoid unwanted network interactions during runtime – no „call home“ or update-checks without user's explicit consent
       
   117 	if any network connection is used, it must be cryptographically secured against MITM attacks
       
   118 
       
   119 		<h2>localized/internationalized</h2>
       
   120 	is is strongly recommended that it should be possible to localize the user interface independently from the original author by writing a language pack
       
   121 	GNU Gettext or other standard framework (like Java resource bundles) should be used
       
   122 	error messages should have assigned unique error codes, so it is possible to find relevant information regardless current locale
       
   123 		GEC is recommended for such unique error identifiers
       
   124 	data formats and protocols must be language/locale independent
       
   125 		e.g. use decimal point instead of comma and no thousand separators for numbers, use standardized date formats
       
   126 		in general: everything that is expected to be machine-readable or machine-generated must be independent from current locale
       
   127 	character encoding:
       
   128 		always be aware of it, don't just blindly use current platform's default (because the other side might run on different platform with different default)
       
   129 		if given software/format/protocol has some default encoding, it must be clearly defined in its specification and this default should not be changed without changing the major version number
       
   130 		if there is no default, the encoding must be specified in the metadata attached (e.g. protocol headers, extended attributes on filesystem) to the actual data or at least at the begining of the data (like declaration in XML format)
       
   131 	the metric system should be used as default
       
   132 
       
   133 		<h2>communication channels</h2>
       
   134 	RSS/Atom or other machine readable format for:
       
   135 		security announcements
       
   136 		new version announcements
       
   137 		infrastructure outage announcements
       
   138 		blog, documentation, how-tos etc.
       
   139 		AFK events (conferences, meetings, hackatons etc.), for calendar data iCal format is strongly recommended
       
   140 	mailing list
       
   141 	e-mail/smtp
       
   142 		use TLS
       
   143 		use DKIM/ADSP
       
   144 		use signed and encrypted messages (GnuPG or X.509)
       
   145 		avoid spam and viruses, don't spam the users, don't push them to subscribe your „newsletter“ – always offer also anonymous channel like RSS/Atom
       
   146 	Jabber MUC or IRC
       
   147 	discussion forum
       
   148 	don't push users to register at a proprietary social networks resp. at particular company like Facebook – users without such account must not be discriminated – use open and decentralized networks/protocols instead
       
   149 	Q&amp;A tool + FAQ
       
   150 	there should be a second-level internet domain for the project or its team
       
   151 	but don't buy an internet domain if you are not prepared to mainain it for decades – rather use third level domain under some reliable second level domain maintained by a credible group or person – think of that every expired domain helps spammers and scammers and hurts the users
       
   152 	URLs should be as stable as possible (don't broke old links, set up redirections if needed)
       
   153 	the website must be independent and must contain everything needed – any content (JavaScripts, CSS, fonts etc.) downloaded from othed domains must not be required to browse/use the website
       
   154 	authors should publish their public keys (GnuPG/OpenPGP or X.509)
       
   155 	crpyptographically secured e-mail address or web form for receiving security vulnerabilities report
       
   156 	every security incident must be clearly documented and investigated – don't obscure it
       
   157 
       
   158 		<h2>open development – has public:</h2>
       
   159 	source code repository (versioning system), not just source code releases
       
   160 	description of the process of accepting external patches
       
   161 	feature/bug tracking system
       
   162 	roadmap of future releases
       
   163 	plan of supported versions/branches
       
   164 	every release/version/branch must clearly declare the status (alpha, beta, prototype, stable, retired, deprecated…)
       
   165 	
       
   166 	
       
   167 	</body>
       
   168 </html>