147 lines
		
	
	
	
		
			5.3 KiB
		
	
	
	
		
			ReStructuredText
		
	
	
	
	
	
			
		
		
	
	
			147 lines
		
	
	
	
		
			5.3 KiB
		
	
	
	
		
			ReStructuredText
		
	
	
	
	
	
.. guidelines/development
 | 
						|
 | 
						|
Development
 | 
						|
===================================================================================================
 | 
						|
As a solo-project, I am not only the **developer**, but also the **manager**. 
 | 
						|
Therefore there is a need, if this project is to succeed, to have a development plan. 
 | 
						|
 | 
						|
Such a plan should:
 | 
						|
 | 
						|
- Define a way to **distribute work** (across time, since there's only 1 developer).
 | 
						|
- Define what is a **unit of work** (cycles).
 | 
						|
- Provide a way to **track productivity**, which helps projecting the future and **detecting patterns** early on.
 | 
						|
- Provide a **pipeline** for the work to go through and **minimize ambiguity**.
 | 
						|
 | 
						|
These are the **management** aspects of the project, which help the development goals to be more **pragmatic**
 | 
						|
---by pulling my mind out of its **engineering dreamland**, and make it focus on the **broader picture**.
 | 
						|
 | 
						|
Cycle
 | 
						|
---------------------------------------------------------------------------------------------------
 | 
						|
A cycle is one **step** in development, one cycle = one ticket, and it consists of 4 stages:
 | 
						|
 | 
						|
1 - Make it known
 | 
						|
    - Write the commit message.
 | 
						|
        - This limits the **scope of changes** and gives you a very specific **goal** to work towards.
 | 
						|
        - If something outside of this scope really bothers you, fix and stash for a future cycle.
 | 
						|
        - Make a ticket if stash-fix is implausible ---**DO NOT** write **todo** comments.
 | 
						|
        - The message should follow the project's **commit message specifications**.
 | 
						|
 | 
						|
    - Make a ticket.
 | 
						|
        - Version control (git) is a **development-tool**, not a **management-tool**.
 | 
						|
        - Provide a very brief description ---This may be used in the commit message's body.
 | 
						|
 | 
						|
2 - Make it work
 | 
						|
    - Write high-level tests that confirms the cycle's requirements are met.
 | 
						|
        - That is, specify requirements in a programming language instead of English.
 | 
						|
        - You're done when all the tests pass.
 | 
						|
        - Preferably write the tests first, but it's okay to start with the interface.
 | 
						|
        - Tests may not be necessary depending on the requirements and commit type.
 | 
						|
 | 
						|
    - "Make it work" doesn't mean liberally producing shit code, you should:
 | 
						|
        - Follow project's **conventions**.
 | 
						|
        - Follow **best practices** and **proven swe principles**.
 | 
						|
        - Enable **warnings as errors**.
 | 
						|
        - Enable **static analysis**.
 | 
						|
        - Don't break any pre-existing-tests.
 | 
						|
        - Have the over-all picture in mind.
 | 
						|
 | 
						|
3 - Make it right
 | 
						|
    - Test driven refactoring
 | 
						|
        - Now you have a better picture of how things relate and work.
 | 
						|
        - Switch to a TDD-style development to do the refactoring while following swe best-practices and proven-principles.
 | 
						|
 | 
						|
4 - Make it fast
 | 
						|
    - This is an engine, at the end of the day, **performance** is king.
 | 
						|
    - Get a performance and/or memory profile and try to alleviate the bottlenecks.
 | 
						|
    - Avoid premature optimizations, be certain what you change has performance benefits.
 | 
						|
 | 
						|
 | 
						|
Sprint
 | 
						|
---------------------------------------------------------------------------------------------------
 | 
						|
A sprint is the collection of all the finished cycles in one week.
 | 
						|
It's meant to provide insight on development speed and help projecting the future.
 | 
						|
 | 
						|
 | 
						|
Commit Message Specification
 | 
						|
---------------------------------------------------------------------------------------------------
 | 
						|
The project follows the `Conventional Commits Specification <https://www.conventionalcommits.org/en/v1.0.0-beta.4>`_.
 | 
						|
 | 
						|
.. code-block:: md
 | 
						|
 | 
						|
    <type>[optional scope]: <description>
 | 
						|
 | 
						|
    [optional body]
 | 
						|
 | 
						|
    [optional footer]
 | 
						|
 | 
						|
With the following commit types:
 | 
						|
 | 
						|
- feat
 | 
						|
    - For adding a new feature.
 | 
						|
    - Causes a **minor** bump in version.
 | 
						|
 | 
						|
- fix
 | 
						|
    - For changes that fix one or more bug.
 | 
						|
    - Causes a **patch** bump in version.
 | 
						|
 | 
						|
- refactor
 | 
						|
    - For non feat/fix changes that improve the implementation and/or the interface.
 | 
						|
    - Causes a **patch** bump in version.
 | 
						|
 | 
						|
- perf
 | 
						|
    - For changes that (hopefully) improve the performance.
 | 
						|
    - Causes a **patch** bump in version.
 | 
						|
 | 
						|
- build
 | 
						|
    - For changes that affect the build system or external dependencies.
 | 
						|
    - Causes a **patch** bump in version.
 | 
						|
 | 
						|
- asset
 | 
						|
    - For changes to the files under the ``/data`` directory.
 | 
						|
    - Causes a **patch** bump in version.
 | 
						|
 | 
						|
- test
 | 
						|
    - For adding missing tests or correcting the existing tests.
 | 
						|
    - Does not affect the version.
 | 
						|
 | 
						|
- chore
 | 
						|
    - For releases, .gitignore changes, deleting unused files, etc.
 | 
						|
    - Does not affect the version.
 | 
						|
 | 
						|
- ci
 | 
						|
    - For changes to our CI configuration files and scripts, including files under ``/tools/ci``.
 | 
						|
    - Does not affect the version.
 | 
						|
 | 
						|
- docs
 | 
						|
    - For changes to the documentations.
 | 
						|
    - Does not affect the version.
 | 
						|
 | 
						|
Semantic Versioning
 | 
						|
---------------------------------------------------------------------------------------------------
 | 
						|
Coupled with conventional commit style messages, we can automajically version the project following
 | 
						|
the **Semantic Versioning 2.0.0** specifications.
 | 
						|
 | 
						|
The full version identifier consits of a version core (major.minor.patch) + label + hexsha of the commit.
 | 
						|
Using the following format:
 | 
						|
 | 
						|
 | 
						|
.. code-block:: md
 | 
						|
 | 
						|
    <major>.<minor>.<patch>-<label>+<short_hexsha>
 | 
						|
 | 
						|
    eg.
 | 
						|
    0.8.1-kitten+ea898 
 | 
						|
    0.5.0-kitten+01d85
 | 
						|
    1.5.0-akasha+7de53
 | 
						|
 | 
						|
    kitten refers to all pre-release (1.0.0) versions
 | 
						|
 | 
						|
 | 
						|
The shortened hexsha of a commit is obtained by:
 | 
						|
``git rev-parse --short=5 <commit_hexsha>``
 | 
						|
 | 
						|
 | 
						|
 | 
						|
 | 
						|
 | 
						|
 |