Compare commits
7 Commits
69a1f4d921
...
design-doc
Author | SHA1 | Date | |
---|---|---|---|
c407728f3b | |||
29deb31729 | |||
a1be811d95 | |||
bd41cf2f64 | |||
e48ec6ce3d | |||
b46cf0bf15 | |||
3bc2738ef6 |
1
cabal.project
Normal file
1
cabal.project
Normal file
@ -0,0 +1 @@
|
||||
packages: */*.cabal
|
33
flake.lock
generated
33
flake.lock
generated
@ -1,32 +1,12 @@
|
||||
{
|
||||
"nodes": {
|
||||
"easy-hls": {
|
||||
"inputs": {
|
||||
"nixpkgs": [
|
||||
"nixpkgs"
|
||||
]
|
||||
},
|
||||
"locked": {
|
||||
"lastModified": 1637250802,
|
||||
"narHash": "sha256-/crlHEVB148PGQLZCsHOR9L5qgvCAfRSocIoKgmMAhA=",
|
||||
"owner": "jkachmar",
|
||||
"repo": "easy-hls-nix",
|
||||
"rev": "7c123399ef8a67dc0e505d9cf7f2c7f64f1cd847",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
"owner": "jkachmar",
|
||||
"repo": "easy-hls-nix",
|
||||
"type": "github"
|
||||
}
|
||||
},
|
||||
"flake-utils": {
|
||||
"locked": {
|
||||
"lastModified": 1637014545,
|
||||
"narHash": "sha256-26IZAc5yzlD9FlDT54io1oqG/bBoyka+FJk5guaX4x4=",
|
||||
"lastModified": 1659877975,
|
||||
"narHash": "sha256-zllb8aq3YO3h8B/U0/J1WBgAL8EX5yWf5pMj3G0NAmc=",
|
||||
"owner": "numtide",
|
||||
"repo": "flake-utils",
|
||||
"rev": "bba5dcc8e0b20ab664967ad83d24d64cb64ec4f4",
|
||||
"rev": "c0e246b9b83f637f4681389ecabcb2681b4f3af0",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
@ -37,11 +17,11 @@
|
||||
},
|
||||
"nixpkgs": {
|
||||
"locked": {
|
||||
"lastModified": 1637841632,
|
||||
"narHash": "sha256-QYqiKHdda0EOnLGQCHE+GluD/Lq2EJj4hVTooPM55Ic=",
|
||||
"lastModified": 1660646295,
|
||||
"narHash": "sha256-V4G+egGRc3elXPTr7QLJ7r7yrYed0areIKDiIAlMLC8=",
|
||||
"owner": "NixOS",
|
||||
"repo": "nixpkgs",
|
||||
"rev": "73369f8d0864854d1acfa7f1e6217f7d6b6e3fa1",
|
||||
"rev": "762b003329510ea855b4097a37511eb19c7077f0",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
@ -53,7 +33,6 @@
|
||||
},
|
||||
"root": {
|
||||
"inputs": {
|
||||
"easy-hls": "easy-hls",
|
||||
"flake-utils": "flake-utils",
|
||||
"nixpkgs": "nixpkgs"
|
||||
}
|
||||
|
48
flake.nix
48
flake.nix
@ -4,54 +4,24 @@
|
||||
inputs = {
|
||||
nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable";
|
||||
flake-utils.url = "github:numtide/flake-utils";
|
||||
easy-hls = {
|
||||
url = "github:jkachmar/easy-hls-nix";
|
||||
inputs.nixpkgs.follows = "nixpkgs";
|
||||
};
|
||||
};
|
||||
|
||||
outputs = { self, nixpkgs, flake-utils, easy-hls }:
|
||||
outputs = { self, nixpkgs, flake-utils }:
|
||||
{
|
||||
overlay = final: prev: {
|
||||
deploy-rauhala-info = with final; runCommand "deploy-rauhala-info.sh" { inherit bash ipfs; }
|
||||
''
|
||||
mkdir -p $out/bin/
|
||||
substituteAll ${./support/deploy-rauhala-info.sh} $out/bin/deploy-rauhala-info.sh
|
||||
chmod u+x $out/bin/deploy-rauhala-info.sh
|
||||
'';
|
||||
build-rauhala-info = final.runCommand "site" { buildInputs = [final.makeWrapper]; }
|
||||
''
|
||||
mkdir -p $out/bin/
|
||||
cp ${final.haskellPackages.build-rauhala-info}/bin/site $out/bin/
|
||||
wrapProgram $out/bin/site --prefix PATH : ${ final.lib.makeBinPath [ final.ipfs ] }
|
||||
'';
|
||||
rauhala-info = final.callPackage ./rauhala.info { site = final.build-rauhala-info; };
|
||||
haskellPackages = prev.haskellPackages.override ( old: {
|
||||
overrides = final.lib.composeExtensions ( old.overrides or (_: _: {})) (f: p: {
|
||||
build-rauhala-info = f.callPackage ./site {};
|
||||
});
|
||||
} );
|
||||
};
|
||||
}
|
||||
//
|
||||
flake-utils.lib.eachDefaultSystem (system:
|
||||
let
|
||||
pkgs = import nixpkgs { inherit system; overlays = [ self.overlay ]; };
|
||||
hp = pkgs.haskellPackages;
|
||||
hls = easy-hls.defaultPackage.${system};
|
||||
pkgs = nixpkgs.legacyPackages.${system};
|
||||
hp = pkgs.haskellPackages.override ( old: {
|
||||
overrides = pkgs.lib.composeExtensions ( old.overrides or (_: _: {})) (f: p: {
|
||||
build-rauhala-info = f.callPackage ./site {};
|
||||
});
|
||||
} );
|
||||
in
|
||||
rec {
|
||||
packages = { inherit (pkgs) build-rauhala-info rauhala-info deploy-rauhala-info; };
|
||||
applications.build-rauhala-info = flake-utils.lib.mkApp {
|
||||
drv = packages.build-rauhala-info;
|
||||
exePath = "/bin/site";
|
||||
};
|
||||
applications.deploy-rauhala-info = flake-utils.lib.mkApp {
|
||||
drv = packages.deploy-rauhala-info;
|
||||
exePath = "/bin/deploy-rauhala-info.sh";
|
||||
};
|
||||
packages.rauhala-info = pkgs.callPackage ./rauhala.info { site = hp.build-rauhala-info; };
|
||||
defaultPackage = packages.rauhala-info;
|
||||
defaultApp = applications.build-rauhala-info;
|
||||
devShell = hp.shellFor {
|
||||
packages = h: [h.build-rauhala-info];
|
||||
buildInputs = with pkgs; [
|
||||
@ -59,7 +29,7 @@
|
||||
cabal-install
|
||||
stylish-haskell
|
||||
entr
|
||||
hls
|
||||
haskell-language-server
|
||||
ipfs
|
||||
];
|
||||
};
|
||||
|
BIN
rauhala.info/images/sample-designdoc.png
Normal file
BIN
rauhala.info/images/sample-designdoc.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 168 KiB |
BIN
rauhala.info/images/stakeholder-architect-design.png
Normal file
BIN
rauhala.info/images/stakeholder-architect-design.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 35 KiB |
@ -5,18 +5,16 @@ title: Mats Rauhala
|
||||

|
||||
|
||||
I'm a software developer from southern Finland. I'm currently working as a
|
||||
Haskell developer at Relex Oy involved in an internal tool. I also have
|
||||
experience with systems integrations and backend web development.
|
||||
|
||||
I'm also an aviation enthusiast. I have a glider pilots license and a touring
|
||||
motor glider pilots license (LAPL(S)+TMG).
|
||||
Haskell developer at Relex Oy. I also have experience with systems integrations
|
||||
and backend web development.
|
||||
|
||||
My [GPG key](./resources/0x9DE6E04ED1918118.txt)
|
||||
|
||||
### Notable experience and interests
|
||||
|
||||
- **Relex Oy**
|
||||
- Working as a Senior Software Developer at Relex Oy
|
||||
- Working as a Lead Software Developer at Relex Oy
|
||||
- Transitioned from day to day code to a role more close to an architect
|
||||
- Three distinct products, all of which written in Haskell
|
||||
- Internal integration tool
|
||||
- Relex Deploy 1, a tool for deploying the core product to hosts
|
||||
|
41
rauhala.info/posts/2022-08-19-design-docs.md
Normal file
41
rauhala.info/posts/2022-08-19-design-docs.md
Normal file
@ -0,0 +1,41 @@
|
||||
---
|
||||
title: Design Documents
|
||||
tags: design
|
||||
---
|
||||
|
||||
We had a problem at work some time ago, with implementing features faster than
|
||||
we could refine new items. The roadmap was a mile long, but the quality of our
|
||||
work items left a lot to desire. The solution was to have more concerted effort
|
||||
into the act of designing and refining. One part of this effort was the
|
||||
introduction of design documents to our workflow.
|
||||
|
||||
[Design Documents at Google](https://www.industrialempathy.com/posts/design-docs-at-google/)
|
||||
|
||||

|
||||
|
||||
We have been experimenting on using design documents for a little over half a
|
||||
year now and have been able to refine them to suit our processes quite nicely.
|
||||
Feel free to read the article above, it's a concise explanation on how they're
|
||||
using design documents, and what I'm going to write is going to focus on a
|
||||
subset of the article, on the aspects that I have found to be important.
|
||||
|
||||
## What are design documents
|
||||
|
||||

|
||||
|
||||
When designing a new feature, the stakeholders have a set of requirements they
|
||||
need fulfilled. The product owner collects the requirements and provides them
|
||||
to the architect to be solved. It's this solution, that needs to be portrayed
|
||||
by the design document. The design document should portrey the high-level view
|
||||
of the design, without implementation details, in a way that the developers can
|
||||
take the design and implement a concrete solution.
|
||||
|
||||
### What should the design document contain
|
||||
|
||||
> A feature to add items to a shopping cart. The items needs to be reserved in
|
||||
the backend so that the reservation is synced across different users.
|
||||
|
||||
The design document should be written on a high level, it should explain the
|
||||
problem and it should explain the solution for it, but it should not be the
|
||||
implementation guide. The design document should not contain any code or
|
||||
pseudocode in it.
|
@ -1,111 +0,0 @@
|
||||
==================================================================
|
||||
https://keybase.io/masser
|
||||
--------------------------------------------------------------------
|
||||
|
||||
I hereby claim:
|
||||
|
||||
* I am an admin of https://masser.keybase.pub
|
||||
* I am masser (https://keybase.io/masser) on keybase.
|
||||
* I have a public key ASD7WFMicMJhoArgnvPuR7Dc92WStIUWWXcyngnsTE_IaQo
|
||||
|
||||
To do so, I am signing this object:
|
||||
|
||||
{
|
||||
"body": {
|
||||
"key": {
|
||||
"eldest_kid": "01202eb5d3b8d2fc63e4bc9c6edefb3a38f1043dfdc44a7268393951fe0ea5214cf00a",
|
||||
"host": "keybase.io",
|
||||
"kid": "0120fb58532270c261a00ae09ef3ee47b0dcf76592b485165977329e09ec4c4fc8690a",
|
||||
"uid": "b01557931e13482e9e646593a64e9119",
|
||||
"username": "masser"
|
||||
},
|
||||
"merkle_root": {
|
||||
"ctime": 1580587604,
|
||||
"hash": "890506579950548b2aa6fd0f35850b9fdb1d064786714f18515d0e3089cdc2458c5fe847d40ca71c2e021ca11677de055ac97804c53d1bef89432f88b57599d4",
|
||||
"hash_meta": "104419595abc52918530f85495417faf35c7a5a608d6730bf53152dfa7288970",
|
||||
"seqno": 14451686
|
||||
},
|
||||
"service": {
|
||||
"entropy": "QIvRp0qNOIZFplyzXERiwp75",
|
||||
"hostname": "masser.keybase.pub",
|
||||
"protocol": "https:"
|
||||
},
|
||||
"type": "web_service_binding",
|
||||
"version": 2
|
||||
},
|
||||
"client": {
|
||||
"name": "keybase.io go client",
|
||||
"version": "4.3.1"
|
||||
},
|
||||
"ctime": 1580587641,
|
||||
"expire_in": 504576000,
|
||||
"prev": "c99f66ba0bfa7ff6be736e24691c8007b0db41b6036b7f1e5f9335ab7f3550f4",
|
||||
"seqno": 34,
|
||||
"tag": "signature"
|
||||
}
|
||||
|
||||
which yields the signature:
|
||||
|
||||
hKRib2R5hqhkZXRhY2hlZMOpaGFzaF90eXBlCqNrZXnEIwEg+1hTInDCYaAK4J7z7kew3PdlkrSFFll3Mp4J7ExPyGkKp3BheWxvYWTESpcCIsQgyZ9mugv6f/a+c24kaRyAB7DbQbYDa38eX5M1q381UPTEIH8FtgpzXt/JJxrhAYknW7xL4+K57JBJnbhFpXWAfEH5AgHCo3NpZ8RApEnmCcZApdOTf+XAHRbbgoysAZHfyTHamWC/BEHKuqEf/BlUFSxo6ASa/YC+Y2sMJfW2iRFlP2bs822TyJTBA6hzaWdfdHlwZSCkaGFzaIKkdHlwZQildmFsdWXEINm3yJdAbmbGJd03EnpuKVh2JzkI8WkngbWbAxbbR0MMo3RhZ80CAqd2ZXJzaW9uAQ==
|
||||
|
||||
And finally, I am proving ownership of this host by posting or
|
||||
appending to this document.
|
||||
|
||||
View my publicly-auditable identity here: https://keybase.io/masser
|
||||
|
||||
===================================================================
|
||||
https://keybase.io/masser
|
||||
--------------------------------------------------------------------
|
||||
|
||||
I hereby claim:
|
||||
|
||||
* I am an admin of https://rauhala.info
|
||||
* I am masser (https://keybase.io/masser) on keybase.
|
||||
* I have a public key ASD7WFMicMJhoArgnvPuR7Dc92WStIUWWXcyngnsTE_IaQo
|
||||
|
||||
To do so, I am signing this object:
|
||||
|
||||
{
|
||||
"body": {
|
||||
"key": {
|
||||
"eldest_kid": "01202eb5d3b8d2fc63e4bc9c6edefb3a38f1043dfdc44a7268393951fe0ea5214cf00a",
|
||||
"host": "keybase.io",
|
||||
"kid": "0120fb58532270c261a00ae09ef3ee47b0dcf76592b485165977329e09ec4c4fc8690a",
|
||||
"uid": "b01557931e13482e9e646593a64e9119",
|
||||
"username": "masser"
|
||||
},
|
||||
"merkle_root": {
|
||||
"ctime": 1580591326,
|
||||
"hash": "2b1b8c5e3de98e3e80ec4b4c28270066744d5d0982c23e4c13ec97d9311e32996b0cc39ab07f51a2418f833d3f03c0219c7ebd8cdc9c99ac09d3f88d0b6129d1",
|
||||
"hash_meta": "0e85fd563e1159d6c5b32f5c424d4c97101c3a11346a0dad77bdbf043ca4f287",
|
||||
"seqno": 14452336
|
||||
},
|
||||
"service": {
|
||||
"entropy": "7UNm+4us1fZE3TRssgGatBC2",
|
||||
"hostname": "rauhala.info",
|
||||
"protocol": "https:"
|
||||
},
|
||||
"type": "web_service_binding",
|
||||
"version": 2
|
||||
},
|
||||
"client": {
|
||||
"name": "keybase.io go client",
|
||||
"version": "4.3.1"
|
||||
},
|
||||
"ctime": 1580591336,
|
||||
"expire_in": 504576000,
|
||||
"prev": "ed5dd9b2571746743f37dd55f59235bd46d7f7de01a2bafba14b9c0929751aee",
|
||||
"seqno": 35,
|
||||
"tag": "signature"
|
||||
}
|
||||
|
||||
which yields the signature:
|
||||
|
||||
hKRib2R5hqhkZXRhY2hlZMOpaGFzaF90eXBlCqNrZXnEIwEg+1hTInDCYaAK4J7z7kew3PdlkrSFFll3Mp4J7ExPyGkKp3BheWxvYWTESpcCI8Qg7V3ZslcXRnQ/N91V9ZI1vUbX994Borr7oUucCSl1Gu7EIJld9Pai+YxhSvZUIA+ZyzwEEbpy98uEqp975YKAEdz9AgHCo3NpZ8RAtksa9w0UQrwg8dPGEzahht+hY4QKQthbZ/yWuOSmfA3C5E1/KorbIEi+tcy5lkSJqNbZRSqBgpl9zerYw5bbAahzaWdfdHlwZSCkaGFzaIKkdHlwZQildmFsdWXEICy29OKKJc5LUELFLo8kW15N3zex43ussKLFeGLhTDapo3RhZ80CAqd2ZXJzaW9uAQ==
|
||||
|
||||
And finally, I am proving ownership of this host by posting or
|
||||
appending to this document.
|
||||
|
||||
View my publicly-auditable identity here: https://keybase.io/masser
|
||||
|
||||
===================================================================================================================================
|
Reference in New Issue
Block a user