Retail operations software for shops that bill all day: invoices, refunds, batch stock, supplier orders and customer ledgers that have to agree with each other.
RoleBuilt it end to end
.lllllllllllllll''lllllllllllllllc
. . ......... 'llcl::ccc:lcccl;;olcclcccccccccll
.........'. ......... ..... 'llclccc::::ccco;,lc:::c:::c:::cll
.;;;;;;;;;;;;;;;..;;;;;;;;;;;;;;;,
.. . . . .... .
... .. ...... . .
..'...,'....'...'' ..';.. .......... .........
'''''',.'',... .,'''..,',.'..,','. '.''',' '',.. ,'';'''. .,;'''..,. ''.,,,,',,';.
. ........... . ................. . ..... ..... ....... .......... .............
... . ...... ... . ...
........,,......... '.. .
......... .. .... .. '... . .. ,.','. '. c,. ,.,;;,'.;,. .'.
.. . . .
. .. . . .. ... ..
.'''.........'''.....''. ..'.... .
.. ..... .. ... .. .......'' . .. ,'.., '. ,,, ..:,,,.'';. .'.
.. . . . .. .
. . . ... . .. .
.'',''''....,,.....','..,. ''..''. .....' .
. . .. .. ... .. ''',.. . .. ,'', '. :'. ',;'..',. .,.
.. . .. .. ....
.... . . . .. ... . .
..,;..,,'.....,...'.''..'' ,'.,,',..'' .
. . .. . . .. '... . .. '''. '. .'' ..'; ',; .,.
. . .
.. . .. . .......
. . . . .
..,:'.,,'....',...'.''..'' ,'.,,,,..'' .
. . . . '... . .. ''.' '. ;.. .',....'. .,.
. . . . . .
.. ..... ... .......
.
.',,',.'',,'' .', .
.. '.. . .. ,..'' .. '.. . ''.....'. .'.
.. . ... ........
........ ... .......
.,,,';',..',.'.',,;...,',,..';,':''.',,,'..''.
. ......... . .. ''.., .. ... . ;........ .,.
. . ... .........
........ ... .......
.
.',,',,,..',.'.',,;'..,',,..,,,,;'.'',;,' .'.
......... . . ...... .. '. ....'...... .,.
.. . . . . ... .......... .
.. ...... ...........
:cccccccccccccccccccccccccc.
...... ...... .c'. .: ,,;'; ,,;. .......... . ............ .. '............ c', ;'';;, .lllllllllllllllll. ,,,,,,,,,,,,,,,,,..ooooolllooooooooo..lllllllll:c::c:c:clllllllll,
..... ...... .'........,.....'. .......... . ........ .. ... ....... '.'. '..'.. .lllllc;:;:;:lllll. ,,,,,''.....,,,,,..ooooocc;;;;:ooooo..ollllllll:l;c;;;:cllllllllo;
.llllllcccc:clllll. ,,,,,'''''.',,,,,..ooooooclccclooooo..ollllllllcllllllccclllllllo;
............... .:.. .: '',', ',;. .lllllc:::::clllll. ,,,,,''.'..',,,,,..ooooolcc::coooooo..olllllll;c',';;c;:;lllllllo;
........ ..... .,.'..,...,.'...,. .;:::::::::::::::;. ................. .;::::::::::::::::..ollllllllcllllllllcllllllll,
.''''''''''''''''''''''''''.
The invoice screen. Screens here are halftoned on purpose, so no customer data survives.
- Team
- Just me, through Commit Software
- Timeline
- 2024 to now
- Stack
- Django, Django REST Framework, PostgreSQL, Redis, Celery, Vue 3, Pinia, TanStack Query
- Source
- Private, client work
What came of it
- 01Billing, refunds, stock and ledgers stay consistent with several cashiers working at once
- 02Every organization's data isolated at the database level
- 03Supplier price lists imported from CSV, Excel and PDF files as they arrive
Polaris started as client work through Commit Software and turned into the system several retail shops run their day on. It covers the parts a shop touches constantly: invoices and quotations, refunds, stock, customer credit, supplier purchasing, expenses, reports, and the admin around all of it.
Most of the work is in the edge cases. A billing screen has to stay right when two cashiers sell the last item, a customer returns half an order on credit, and a supplier's price list arrives as a scanned PDF.
.c.:;..l.,;,'c, ,c ,,'.c',.;,';,,'c, '::,;,.;;.:,';.;.;,.;:.c, .;,.;.,;;.;:.;,',,.l':.:;.c; ;:.:.;;;,;;,; ;'c.;;,;:. ;,;.c:;:.:;'.l..c.;.;;':';'c' .l.l..c ;;,,,',:.;:',c';.;;.
l do'oclc:x,lx'dl;c;, l c;l;cl;k,od ;l.cd:::l'd;:ccl,c;.':.od ;:;.oc;;d,';.l;ccold:x'dd.ld. ,x;l:cl:.o;.o.l:k;ld;;x, l;l;d':x'dd,llo o l;l;:o;k'do .ddd,olclo:lo,cx.':'cd:x,lo,
.....................'''''''''''''''''. ...........''''''''''''''''',,,,,,,,,,,. .........'''''''''''''''',,,,,,,,,,,,,' .....................''''''''''''''',,'. .......''''''''''''''',,,,,,,,,,,,,,,,' ..............''''''''''''''',,,,,,
.;;;;;;;::::::::c:::cccccllllllloooooooo. ;:::::cccccccclllllclllloooooodddddddddc ':::::ccccccclllllllllloooooodddddddddxx; ,;;;;;;:::::::::cccccccclllllllloooooooo. .::cccccccclllllllloooooooooddddddddxxxx: ,;;::::::::ccccccccllllllloooooooood
.;;;;;;::::::::cc. ...,ccllllllloooooooo. .;::::::ccccccccc' .:ooooooddddddddxl ':::::ccccccclllll, ;ooooooddddddddxxx; ,;;;;;;:::::::::cccccccclllllllloooooooo. .::ccccccccclllllllooooooooodddddddxxxxx: ,;:::::::::ccccccccllllllloooooooood
';;;;;;::::::::cc. ;cllllllloooooooo. .:::::::ccccccccc.... ..:ooooooddddddddxl ':::::ccccccccllll;. .:ooooooddddddddxxx: ,;;;;;;::::::::......;cclllllllloooooooo. .::cccccccccllllll;''';loooddddddddxxxxx: ,;::::::::cccccccccllc,,lloooooooood
';;;;;;::::::::cc. .. ;lllllllloooooooo. .:::::::ccccccccc. ..:ooooooddddddddxl ':::::cccccccclll:':':,coooooddddddddxxx: ,;;;;;;:::::::; ..'cllllllloooooooo. .::cccccccccllllc.. .. :ooodddddddxxxxx: ,;;:::::::cccccc,..''...lloooooooood
';;;;;;::::::::cc. . :lllllllloooooooo. .:::::::ccccccccc,. .cooooooddddddddxl ':::::ccccccccllc . . .oooooddddddddxxx: ,;;;;;;:::::::; .. 'llllllloooooooo. .::cccccccccllll' .' ..ooddddddddxxxxx: ,;;:::::::ccccc: ';c' cloooooooood
';;;;;;::::::::ccccccccccllllllloooooooo. .:::::::cccccccclllllllooooooooddddddddxl ':::::cccccccclllllllllooooooddddddddxxx: ,;;;;;;:::::::;. . .. ' 'llllllloooooooo. .::cccccccccllllc. .,. .cooodddddddxxxxx: ,;;:::::::cccccc: ,,'..lloooooooood
';;;;;;:::::;::ccccccccccccllllloooooooo. .:::::::ccccc:cclllllclllooloooddddddddxl ':::::ccccc:cclllllllloooooooodddddddxxx: ,;;;;;;:::::::::,';cc,';lllllllloooooooo. .::cccccccccllllllc,,,cooooodddddddxxxxx: ,;;:::::::ccccccc,'cllcclloooooooood
';;;;;;:::;......''..''.'..,.;lloooooooo. .:::::::ccccc..',''',.':',;.:ooddddddddxl ':::::cccc',,';','.,''',',,',,lddddddxxx: ,;;;;;;:::::::::::cccccccllllllllooooooo. .::ccccccccclllllllllooooooodddddddxxxxx: ,;;:::::::cccccccccclllllllooooooood
';;;;;;::::,,;,,;:;;;;:;;:;:;clloooooooo. .:::::::ccccc;c:c:;c;;:;c::ccooddddddddxl ':::::cccc:;;:;:::c:::clccc:cldddddddxxx: ,;;;;;,.,,;,,,;,;';::;,,,,::;:,::llooooo. .::cccccc,,,:;:::,;:,:c:cc:c:c:;dddxxxxx: ,;;:::::,'',;,;;,;;:;:,;;;c::c:coood
';;;;;;::::::::::::cc::ccclllllloooooooo. .:::::::cccccccccclllclooooooooodddddddxl ':::::cccccccccllllllllooooooodddddddxxx: ,;;;;;,.'......'.''.c,,;,;'',',,:;oooooo. .::cccccc','',''',;'''';,',';;;,dddxxxxx: ,;;:::::,';',''';''',,',',,':,';oood
';;;;;;:::::;..''''',..';'';lllloooooooo. .:::::::ccc.,.'''.,,'.,',';,,':odddddddxl ':::::ccccccc..''',,;,,,;,':oodddddddxxx: ,;;;;;:::::;;:;:cc;:cccclllllllloooooooo. .::ccccccccccllllloooooooooodddddddxxxxx: ,;;::::::::ccccccclllllllllooooooood
';;;;;;::::::,,;;,;;,;;;;;;clllloooooooo. .:::::::ccc;;:,,:;;;;;;:;;:;c:lddddddddxl ':::::ccccccc;::;;:;c:::l::ldddddddddxxx: ,;;;;;;:::::::::cccccccclllllllloooooooo. .::ccccccccclllllloooooooooodddddddxxxxx: ,;;::::::::ccccccccllllllloooooooodd
';;;;;;:::::::::cccccccclllllllloooooooo. .;::::::ccccccccllllllloooooooooddddddddl ,:::::cccccccclllllllooooooooddddddddxxx; ,;;;;;;:::::::::cccccccclllllllloooooooo. .::cccccccccllllllooooooooooddddddddxxxx: ,;;::::::::ccccccclllllllloooooooood
.'''''''''''',,,,,,,,,,,,,,,;;;;;;;;;;' .'''',,,,,,,,,,,,,,;;;;;;;;;;;::::::::;. ..',,,,,,,,,,,;,,;;;;;;;;;;;;;:::::::::;. ..'''''''''',,,,,,,,,,,,,;;;;;;;;;;;;;;' .',,,,,,,,,,,;;;;;;;;;;;;;;:::::::::::;. .''''',,,,,,,,,,,,,,,;;;;;;;;;;;;;::
..................................... ...................................... .................................. ..................................... .................................... ..................................
.;:::ccccccccclllllllloooooooddddddddxxo. .oxkkkkkkkkkOOOOOOOOOOOOOOO0000000000000c .;::::cccccccccclllllllooooooooddddddddd' ',;;;;;;;;::::::::::cccccccccclllllllll: .;;;::::::cccccccllllloooooodddddxxxxxxd, ':::::cccccccclllllllloooooodddddddd
':::::ccccccclllllllloooooooodddddddxxxx' .kkkkkkkkkkkOOOOOOOOOOOOOOO0000000000000x '::::::cccccccccc'......looooodddddddddx; ,;;;;;;;;;::::::;......,ccccccclllllllll. .;;;:::::ccccccclllllooooooodddddxxxxxxx: ;:::::cccccccclllllllloooooodddddddd
,:::::cccccccclllllllloooooooddddddddxxx' .kkkkkkkkkkkOOOOOOOOOOOOOOO0000000000000x '::::::ccccccccl: ... looooodddddddddd; ,;;;;;;;;;::::::. ... .ccccccclllllllll. .;;;:::::ccccccclllllloooooodddddxxxxxxkc ;:::::cccccccclllllcccoooooodddddddd
,:::::cccccccccc'..''.'looooodddddddxxxx' .kkkkkkkkkkkOOOOo.xccclOOOO0000000000000x '::::::ccccccccl: looooodddddddddd; ,;;;;;;;;;::::::. .ccccccclllllllll. .;;;:::::cccccccl. .looodddddxxxxxxkc ;:::::ccccccccllc......:oooodddddddd
':::::cccccccccl,..:ll..ooooodddddddxxxx' .kkkkkkkkkkkOOOOl d'.;xOOOO0000000000000x '::::::ccccccccl: ......oooooodddddddddd; ,;;;;;;;;;::::::. .... ,ccccccclllllllll. .;;;:::::cccccccl cooodddddxxxxxxkc ;:::::ccccccccll......' cooodddddddd
':::::cccccccccllc:llc.'ooooodddddddxxxx' .kkkkkkkkkkkOOOOl x::::lOOO0000000000000x ,::::::ccccccccll;,,,,,;looooodddddddddd; ,;;;;;;;;;::::::;'''''';ccccccclllllllll. .;;;:::::cccccccc ..looodddddxxxxxxkc ;:::::ccccccccll......' cooodddddddd
':::::cccccccclllc,''':oooooodddddddxxxx' .kkkkkkkkkkkOOOOx;;;;;;;cOO0000000000000x '::::::ccccccccllllllllloooooooddddddddd; ,;;;;;;;;;::::::::::ccccccccccclllllllll. .;;;:::::cccccccl'...,,loooodddddxxxxxxkc ;:::::ccccccccllc,....'coooooddddddd
':::::ccccccccllllllloooooooodddddddxxxx' .kkkkkkkkkkkOOOOOOOOOOOOOO00000000000000x '::::::ccc;,;;c:;:,;;;:;;;c:c:lodddddddd; ,;;;;;;;;;:;.,,;,,,,,;'';,;,:cclllllllll. .;;;:::::ccccccclllllooooooodddddxxxxxxkc ;:::::cccccccclllllllooooooooddddddd
':::::cccc::cll:llllllocolllclldddddxxxx' .kkkkkdxkkkkOOxOOOOOkOkxkOOO000000OO0000x '::::::ccc,,,,'''',,''':,;,',,oddddddddd; ,;;;;;;;;;:;...'.....'.''.',ccclllllllll. .;;;:::::cccccccccllcloooooodddddxxxxxxkc ;:::::ccc::ccclllllllllllooooodddddd
'::::::cc:..'.'.';'.'',.o..''.'dddddxxxx' .kkkkd.;,c,;;:.:l:;l'xl.,:,;;;;c:;;:0000x ':::::cccccccccccllllllllooooooodddddddd; ,;;;;;;;;;:::::::;:;:cccccccccclllllllll. .;;;:::::ccccc:...''.'..,.lodddddxxxxxxkc ;:::::cc.,'''.''''',''',''.,,,,'oddd
'::::::ccc:;:;:::;:ccc::oc:lllldddddxxxx' .kkkkxdkdkooxoddoxoddxkxxxdocdkdkkOx0000x ':::::ccccccc;;c;::,;::c:c:loodddddddddd; ,;;;;;;;;;:::';,,;,';,;;;;;cccclllllllll. .;;;:::::cccccc:::::c:::c:oodddddxxxxxxkc ;:::::cc:;;:;::ccc,;c::cc''clllcdddd
':::::cccccccllllllllooooooooddddddddxxx' .kkkkkkkkkkkOOOOOOOOOOOOOOOOO00000000000x '::::::cccccc;''.'.'.'.'.,,ooodddddddddd; ,;;;;;;;;;:::.,...'.......;cccclllllllll. .;;;:::::ccccccllllllooooooddddddxxxxxxkc ;:::::cccccccllllllllooooooooodddddd
,:::::ccccccclllllllloooooooddddddddxxxx' .kkkkkkkkkkkOOOOOOOOOOOOOOO0000000000000x ,:::::ccccccccclllllc::loooooodddddddddd; ,;;;;;;;;;::::::::::;,;cccccccclllllllll. .;;;:::::ccccccllllllooooooddddddxxxxxxkc ;:::::cccccccllllllllooooooooodddddd
.;::::::cccccccllllllllooooooooddddddddo. .oxkkkkkkkkkkkkkkkOOOOOOOOOOOOOOO000000Oc .;:::::::ccccccclllllllllooooooooddddddo' ',;;;;;;;;;;:::::::::::ccccccccclllllll: .,;;;::::::ccccccllllllooooooddddddxxxxd, ';:::::ccccccccclllllllooooooooddddd
..................................... ...................................... ..................................... ..................................... ..................................... ...................................
.clllllloooooooooooddddddddddddxxxxxxxxl .......................''''''''''''''''. .......................''''''''''''''''. .''''''''',,,,,,,,,,,,;;;;;;;;;;;:::::;. ..'''''''''''',,,,,,,,,,,,,,;;;;;;;;
o0000000KKKKKKKKXXXXXXNNNNNNNNWWWWWWWWWM; ....'''''''''',,,,,,,,;;;;;;;::::::::::; ....'''''''''',,,,'',,,;;;;;;;;:::::::::' .;;;;::::::::ccccccclllllllooooooooddddd; ,;;;;;;;:::::::::ccccccclllllllloooo
o000000KKKKKKKKXXXXXXXNNNNNNNNWWWWWWWMMM; .....'''''''',,,,,,,,,;;;;;;;::::::::cc; .....''''''''',,'.. . .,;;;;::::::::::c' .;;;;:::::::cccccccclllllllooooooooddddd: ,;;;;;;;::::::::cccccccclllllllloooo
o0000000KKKKKKKKdcccclll0NNNNNWWWWWWWMMM; .....'''''''',,,,,,.',;;;;;;;::::::::cc; ....'''''''''',,. ';;;;;:::::::::c' .;;;;:::::::cccc:cc:;,'';llooooooooddddd: ,;;;;;;;::::::::::,'',:ccllllllloooo
o0000000KKKKKKKXo......'KNNNNNWWWWWWWMMM; .....'''''''',,,,,. .;;;;;;;::::::::cc; .....'''''''',,,' ' ;;;;;;:::::::::c' .;;;;:::::::ccc: . . . :looooooooddddd: ,;;;;;;;::::::::. .cllllllloooo
o0000000KKKKKKXXd ... .XNNNNNWWWWWWWMMM; .....''''''',,,,' . .;;;;;;::::::::cc; .....'''''''',,,' ' .;;;;;;:::::::::c' .;;;;:::::::ccc: .c' :looooooooddddd: ,;;;;;;;::::::::. :llllllloooo
o0000000KKKKKKKXk 'NNNNNNWWWWWWWMMM; ....'''''''',,,' .;;;;;::::::::cc; .....'''''''',,,,,,,,;;;;;;;;::::::::::c' .;;;;:::::::ccc:.. ...'.clooooooooddddd: ,;;;;;;;::::::::. ....':lllllllloooo
o0000000KKKKKKKXXKKKKKKXNNNNNNWWWWWWWMMM; .....'''''',,,,,,,,,,,,,;;;;;::::::::cc; .....''''''''',,,,,,,,,',;;;;;:::::::::c' .;;;;:::::::cccccccclllllllooooooooddddd: ,;;;;;;;::::::::::cccccccllllllloooo
o0000000KKKKKKKXXXXXXXXNNNNNNNWWWWWWWMMM; ....'''''''',,,,,,,,,,;;;;;;;::::::::cc; .....''''''''.'............';;:::::::::c' .;;;;:::::::cccccccclllllllloooooooddddd: ,;;;;;;;;::::::::ccccccccllllllloooo
o0000000KKKKKcokdxdolxlxOkdkNNWWWWWWWMMM; ....'..'.....'.....''.'..'.''''',,:::cc; .....'''''''''.'''.,'',,,,.;;;:::::::::c' .;;;;::::::'';,,,,;,;,;;;:;:;:oooooddddd: ,;;;;;;;;:..,',,,,,'.,;,,;,;';lloooo
o000000KKKKKkllokoxdkodkckcoNNWWWWWWWMMM; ....'........''.....'...'......;.;:::cc; .....'''''''.'',,,,,,,,;;;;;;;:::::::::c' .;;;;::::::',,..'''',;,;',';,;oooooddddd: ,;;;;;;;;;','.'..','.,''',,:';lloooo
o000000KKKKKKKKKXXXXXXXNNNNNNNWWWWWWWWMM; ....'''''''',,,,,,,,,,;;;;;;;;:;;::::cc; .....''''''..................,:::::::::c' .;;;;::::::::cc::ccccllllllooooooooddddd: ,;;;;;;;;::::::::ccccccccclllllloooo
o000000KKKKKKKKKXXXXXXNNNNNNNNWWWWWWWMMM; ....''''''''',,,,,,;;;;;;;;;;;:::::::cc; .....'''''''''.'.'...',''',,,;:::::::::c' .;;;;:::::::cccccccccllllllooooooooddddd: ,;;;;;;;::::::::cccccccclllllllloooo
l000000KKKKKKKKXXXXXXXNNNNNNNNWWWWWWWMMM; ....''''''''',,,,,,;;;;;;;;;;::::::::cc; .....''''''''',,,,,,,,;;;;;;;::::::::::c' .;;;;::::::::ccccccccllllllooooooooddddd: ';;;;;;;::::::::cccccccclllllllloooo
.;::::::::cccccccccccccccllllllllllllll; ...............................'''''''.. ............................''''''''''. ....'''''''''''''''''',,,,,,,,,,,,,,,,'. ......'''''''''''''''''''',,,,,,,,,,
. . . .
...................................
Stock derived from batches
A product's quantity is always derived from batch records, never typed in: what came in, from whom, at what cost, and what's left. That rule made every other module stricter. Billing, restocking, cycle counts and supplier returns all have to go through the same contract, and none of them can "just fix the number".
It costs more work up front, and it's why stock counts in Polaris can be trusted at the end of the day.
Several cashiers at once
The race conditions came first, as they do. Two cashiers selling the last unit took stock negative, and two operations on one customer could leave a balance that matched neither. The war stories post has the details. These are the fixes that stuck:
- row locks that fail fast and retry briefly instead of queueing, so a cashier sees a blip at worst
- version checks, so a stale form can't overwrite newer edits
- per-customer and per-supplier advisory locks for ledger work, with keys that mean the same thing on every worker process
- tests that pin those contracts down, including one that checks lock keys come out the same under different hash seeds
Tenants separated in the database
Polaris is multi-tenant. The organization is set once per request and carried down into the database session, so the separation doesn't depend on every query remembering a filter.
Supplier files arrive however suppliers like
Price lists come as CSV, Excel and PDF, with inconsistent names, missing units and layouts that change without warning. The import path extracts, normalizes and matches them against the catalogue, with aliases for the names suppliers insist on using. It locks around anything that can change purchasing, because a half-applied price list is worse than none.
:clcclclllllllc:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::oOOOOdxOOxkdddxxdxOdxdxxxxxxdxOOOdcxOOOxxxkddxxxddOdxxxOOk:oOOOo
:ccccc:::;;;::;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;cddddooddooooooooddooloooooooodddl;odddo:ldoododoodooooddo;cdOOd
;cccc: xkd
;::::: . . . :c;
;c:::c. .ooco:l::oc::cllco.;oc,:oclccc;loc..l:ccccooc: :c;
;ccccc. .. . . . . . . ..;.'' . .. . . :c;
:llloc. :c;
:llllc. :c;
;ccccc. ' :c;
:cccll. .;.cl:
:lllll. . .. . . .. .c.cl:
coodoo. . cl:
codood. cl:
:lllll. cl:
:lllll. cl:
:lllll. ........ .. .......... ......... . ... ..... ... ..... ..... . .. .......... cl:
:lllll. . . cl:
ldxxdx. cl:
:lllll. cl:
:lllll. cl:
:lllll. . . . . . cl:
:lllll. cl:
lddxdd. cl:
cllloo. cl:
:lllll. cl:
:lllll. .,....'..... '........ '........'................. ........ ............. cl:
:lllll. .......... ......... ............. ............. ........ ............ cl:
coodoo. cl:
codood. cl:
:lllll. .,'..'.'.',:'',, ,:,',;;,,. ,.','.:.; ,':''';;..,'.. ,;,:.:,'.c'. .,..:,.., .'. cl:
:ccccl. . . . . . . . . . . . . . . . . cc:
;ccccc. :c;
;ccccc. :c;
lxdlod. .'.........,.... .,...'''.. '.....,.' '.,...''.......,'.''..;'. ...;.... ... :c;
;:::cc. ....... ...... ......... .. .... .......... ..... .. . . . . :c;
;:::cc. ::;
;::::c. ::;
;::::c. .. . . . . .. .......... . ... ... . . .. ... .'..... ... .. ... . .. ::;
cocddd. ...........'..'' ....'.'''. ...'..,.' ..'...''...... ..'.... '.. .. ....' ... ::;
:c:ccc. ::;
;::::c ::;
;::::c . . . . . . . . ::;
;:::cc .''.''';..';',;, ',,';,;;;. ..,,'':': '';',':,.','.. ,,,';'..:,. .'..'''.; ... :c;
:llcll. :c;
coocco. :c;
;:::cc. :c;
;:::cc. .;,;.'',.''. ;';.'.....'. ';;.. ...'....,.,'.' ... :c;
;::::c. ...... .. . .. .. . . .. . .. . ::;
;:::cc ::;
ldollx. ::;
;::::c. .,'.'..... ' '........ ..'... ....... . ...'. ... ::;
;::::c. .... .... ........... ..... ...'.... . ...... .. ::;
;::::c. :c;
;cc::c. :c;
cocolo. . . . . . . . . . . :c;
:cclcl. .,',',;,.;,. ...'.',.' '. ' ..'',''. ... :c;
;ccccc. :c;
;::::c. ::;
;::::c. . ::;
:cclcl. .:;:,,;;';;. c;;.,;. ','. ..',.'',:.;,'' .'. ::;
:lclll. ::;
;::::: ::;
;ccccc. :c;
:lllll. .....'.... ....',.,'. ,,........,;..'.'' . ....'.'. .......... ... cl:
:lllll. . . .. ...... . ........ .. .. . .. . . . cl:
ldldod. cl:
:lllll. cl:
:lllll. . ........ ......... ....... ....'..... . .. ..... . ....... ... cl:
:lllll. ......... ....'...'. ....... . '......' . ......'. . ........ .. cl:
:lllll. cl:
ldodod. cl:
cllooo. .. . . ..... . .. . .. . cl:
:lllll. ...'.',''. ...';;',;. ''..'., .';.;';,'' . ...,;.;. .'....','.;. ... cl:
:lllll. cl:
:lllll. cl:
colooo. cl:
lolood. ..''.,'.'. ,...;;';,. ,,,'' ''; ., ,...,',. .,..'..',. .'. cl:
:lllll. . . . . cl:
:ccccl. cl:
;:::::. ' :c;
;:::::. ::;
ldoddd. ::;
;::::c. ............................ ..''''''''''''''.. ::;
;::::c. lxxxxxxxxxxxxxxxxxxxxxxxxxxxd .kkkkkkkkkkkkkkkkkx. ::;
:lllll. lxxlc:c:ccc::cl:::cd;c:c;lxxx..kkkcollcllloclckkk. cl:
:lllll. lxxdloooodolodlooooddxoooxxxx..kkkdodoodddddddkkk. cl:
ldldod. .:cccccccccccccccccccccccccc, :cllllllllllllllc; cl:
ldlddd. cl:If I started it again
- I'd write explicit services from the start. Early versions spread business rules across Django signals; they're now plain service functions you can read top to bottom. The performance log covers that and the other early mistakes.
- Concurrency tests on day one. Every serious bug in Polaris was a concurrency bug that a two-thread test would have caught.
- A written contract for every module boundary, since the worst bugs lived in the gaps between modules.
End of case study.