-
Notifications
You must be signed in to change notification settings - Fork 6
Expand file tree
/
Copy pathprinciples.html
More file actions
943 lines (564 loc) · 52.6 KB
/
principles.html
File metadata and controls
943 lines (564 loc) · 52.6 KB
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
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
<!DOCTYPE html>
<html lang="en">
<head>
<title>Monadical Principles Handbook</title>
<!-- Meta Tags Start -->
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="title" content="Monadical Principles Handbook">
<meta name="description" content="Our goal with this document is to share some of our knowledge and expertise around the process of working together as a team, in order to achieve a more efficient, happy and healthy working environment.">
<meta property="og:locale" content="en_US" />
<meta property="og:description" content="Our goal with this document is to share some of our knowledge and expertise around the process of working together as a team, in order to achieve a more efficient, happy and healthy working environment.">
<meta property="og:image" name="image" content="https://monadical.com/static/full-stack.jpg">
<meta property="og:title" content="Monadical Principles Handbook">
<meta property="og:type" content="article">
<meta property="og:url" content=https://monadical.com/principles.html />
<meta property="og:site_name" content="Monadical Consulting" />
<meta property="twitter:card" content="summary_large_image">
<meta property="twitter:description" content="Our goal with this document is to share some of our knowledge and expertise around the process of working together as a team, in order to achieve a more efficient, happy and healthy working environment.">
<meta property="twitter:image" content="https://monadical.com/static/full-stack.jpg">
<meta property="twitter:site" content="@MonadicalHQ">
<meta property="twitter:title" content="Monadical Principles Handbook">
<meta property="twitter:url" content=https://monadical.com/principles.html />
<meta name="msapplication-TileColor" content="#da532c">
<meta name="theme-color" content="#ffffff">
<!-- Meta Tags End -->
<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Open+Sans|Ubuntu" type="text/css">
<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Fjalla+One" type="text/css">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Lato:ital,wght@0,100;0,300;0,400;0,700;0,900;1,100;1,300;1,400;1,700;1,900&display=swap" type="text/css">
<link rel="stylesheet" href="https://cdn.jsdelivr.net/font-hack/2.020/css/hack.min.css" type="text/css">
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/font-awesome/4.7.0/css/font-awesome.min.css"
type="text/css">
<link rel="stylesheet" href="/static/bootstrap4-pleasant.min.css" type="text/css">
<link rel="stylesheet" href="/static/core/css/base.css" type="text/css">
<link rel="canonical" href="https://monadical.com/principles.html" />
<link rel="apple-touch-icon" sizes="76x76" href="/static/favicon/apple-touch-icon.png">
<link rel="icon" type="image/png" sizes="32x32" href="/static/favicon/favicon-32x32.png">
<link rel="icon" type="image/png" sizes="16x16" href="/static/favicon/favicon-16x16.png">
<link rel="mask-icon" href="/static/favicon/safari-pinned-tab.svg" color="#5bbad5">
<link rel="stylesheet"
href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.4.0/styles/atom-one-light.min.css">
<script src="https://code.jquery.com/jquery-3.3.1.slim.min.js"
integrity="sha384-q8i/X+965DzO0rT7abK41JStQIAqVgRVzpbzo5smXKp4YfRvH+8abtTE1Pi6jizo" crossorigin="anonymous">
</script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.12.9/umd/popper.min.js"
integrity="sha384-ApNbgh9B+Y1QKtv3Rn7W3mgPxhU9K/ScQsAP7hUibX39j7fakFPskvXusvfa0b4Q" crossorigin="anonymous">
</script>
<script src="https://stackpath.bootstrapcdn.com/bootstrap/4.1.0/js/bootstrap.min.js"
integrity="sha384-uefMccjFJAIv6A+rW+L4AHf99KvxDjWSu1z9VI8SKNVmz4sk7buKt/6v9KI65qnm" crossorigin="anonymous">
</script>
<link rel="stylesheet" href="/static/core/css/index.css">
<link rel="stylesheet" href="/static/core/css/post.css">
</head>
<body>
<header>
<div id="header-container" class="container">
<nav class="navbar navbar-expand-lg navbar-dark">
<a class="navbar-brand" id="monadical-brand" href="/index.html">
<img srcset="/static/core/img/logo@3x.png 3x,
/static/core/img/logo@2x.png 2x"
src="/static/core/img/logo.png"
id="brand-img" />
</a>
<button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbarSupportedContent">
<span class="navbar-toggler-icon"></span>
</button>
<div class="collapse navbar-collapse" id="navbarSupportedContent">
<div class="navbar-content-container">
<ul class="navbar-nav">
<li class="nav-item">
<a class="nav-link "
href="/index.html">Home</a>
</li>
<li class="nav-item">
<a class="nav-link "
href="/portfolio.html">Portfolio</a>
</li>
<div class="nav-item dropdown">
<button class="nav-link btn-link dropdown-toggle" type="button"
id="dropdownservicesButton" data-toggle="dropdown" aria-haspopup="true"
aria-expanded="false">
Services
</button>
<div class="dropdown-menu" aria-labelledby="dropdownservicesButton">
<a class="dropdown-item nav-link"
href="/ai-services.html">AI</a>
<a class="dropdown-item nav-link"
href="/services.html">Web Dev</a>
</div>
</div>
<li class="nav-item">
<a class="nav-link "
href="/about.html">About Us</a>
</li>
<li class="nav-item">
<a class="nav-link" target="_blank"
href="https://careers.monadical.com/">Careers</a>
</li>
<li class="nav-item">
<a class="nav-link "
href="/blog.html">Insights</a>
</li>
<li class="nav-item">
<a class="nav-link"
href="/contact-us.html">LET'S TALK</a>
</li>
</ul>
</div>
</div>
</nav>
</div>
</header>
<article>
<div id="post-content">
<div class="container">
<div class="row">
<div class="col">
<article class="article-content">
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8"/>
<meta content="IE=edge" http-equiv="X-UA-Compatible"/>
<meta content="width=device-width, initial-scale=1.0, user-scalable=no" name="viewport"/>
<meta content="yes" name="apple-mobile-web-app-capable"/>
<meta content="black" name="apple-mobile-web-app-status-bar-style"/>
<meta content="yes" name="mobile-web-app-capable"/>
<meta content="<center> # Monadical Principles Handbook *Originally published 2017-01-01 on [Monadical.com](https" name="description"/>
<base href=""/>
<title>Monadical Principles Handbook</title>
<link href="https://docs.monadical.com/icons/apple-touch-icon.png" rel="apple-touch-icon" sizes="180x180"/>
<link href="https://docs.monadical.com/icons/favicon-32x32.png" rel="icon" sizes="32x32" type="image/png"/>
<link href="https://docs.monadical.com/icons/favicon-16x16.png" rel="icon" sizes="16x16" type="image/png"/>
<link href="https://docs.monadical.com/icons/site.webmanifest" rel="manifest"/>
<link color="#b51f08" href="https://docs.monadical.com/icons/safari-pinned-tab.svg" rel="mask-icon"/>
<link href="https://docs.monadical.com/icons/favicon.ico" rel="shortcut icon"/>
<meta content="HedgeDoc - Ideas grow better together" name="apple-mobile-web-app-title"/>
<meta content="HedgeDoc - Ideas grow better together" name="application-name"/>
<meta content="#b51f08" name="msapplication-TileColor"/>
<meta content="https://docs.monadical.com/icons/browserconfig.xml" name="msapplication-config"/>
<meta content="#b51f08" name="theme-color"/>
<link href="https://docs.monadical.com/build/emojify.js/dist/css/basic/emojify.min.css" rel="stylesheet"/>
<link href="https://docs.monadical.com/build/font-pack.4362583c9249021b5028.css" rel="stylesheet"/><link href="https://docs.monadical.com/build/2.15c517ea2148f55c8206.css" rel="stylesheet"/><link href="https://docs.monadical.com/build/3.ec6e7d6280fcd73e729d.css" rel="stylesheet"/><link href="https://docs.monadical.com/build/pretty-styles-pack.2fb0d01138de2df6de0a.css" rel="stylesheet"/><link href="https://docs.monadical.com/build/pretty-styles.8aa1888af7df52aee395.css" rel="stylesheet"/><link href="https://docs.monadical.com/build/1.1666d9d869a0532d9bce.css" rel="stylesheet"/><link href="https://docs.monadical.com/build/pretty.6b8d0fd475bd77f9c4c4.css" rel="stylesheet"/>
</head>
<body style="display:none;">
<div class="ui-infobar container-fluid unselectable hidden-print">
<small>
<span>
<span class="ui-lastchangeuser"> <i class="ui-user-icon small" data-placement="right" data-toggle="tooltip" style="background-image: url(https://docs.monadical.com/user/ana/avatar.svg);" title="ana"></i></span>
<span class="text-uppercase ui-status-lastchange"></span>
<span class="ui-lastchange text-uppercase" data-createtime="Thu Feb 14 2019 01:14:22 GMT+0000 (Coordinated Universal Time)" data-updatetime="Thu Jan 23 2025 19:00:06 GMT+0000 (Coordinated Universal Time)"></span>
</span>
<span class="pull-right">18566 views <a class="ui-edit" href="https://docs.monadical.com/#" title="Edit this note"><i class="fa fa-fw fa-pencil"></i></a></span>
<br/>
<span class="ui-owner">
<i class="ui-user-icon small" data-placement="right" data-toggle="tooltip" style="background-image: url(https://docs.monadical.com/user/nick/avatar.svg);" title="nick"></i>
<span class="text-uppercase">owned this note</span>
</span>
</small>
</div>
<div class="container markdown-body" id="doc"><center>
# Monadical Principles Handbook
*Originally published 2017-01-01 on [Monadical.com](https://monadical.com/principles).*
</center>
Our goal with this document is to share some of our knowledge and expertise around the process of working together as a team, in order to achieve a more efficient, happy and healthy working environment. This is a living document and we expect it to change as we grow and evolve over time.
[TOC]
## <a name="transparency">1. Transparency</a>
*We believe that free flow of information is paramount to the success of any organization. The more information a person has, the better they are able to make good decisions. Here are some ways in which we work to maximize transparency at Monadical.*
**Ask all the questions.**
There is no such thing as a stupid question, and you should never be afraid to ask if you don't understand something! Likewise, if someone asks you a question you think is silly, don't mock them, answer it genuinely and nicely.
Everyone asks silly questions from time to time, and no one likes to feel dumb.
Also, if you don't agree with something, feel free to bring it up and criticize it! Just make sure to do it respectfully--see the next section on how.
**Say what you mean, and mean what you say.**
This can take a little getting used to, but if everyone means what they say discussions become a lot easier and less like a social dance. We've found that beating around the bush causes a lot of problems, and everything goes smoother if people make an effort to be direct. This doesn't mean we should bash each others work without thinking about how it will be received though.
If you offer feedback to someone, assume that your critique will be received in good faith. Saying things indirectly, not at all, or sugar-coating implies that you don't trust the recipient of your critique to receive it well.
Likewise, if you say something, make sure you mean it when you say it. It's easy to blurt things out in frustration that you don't mean, and then regret it later. It's also easy to say things you half-mean, because you think that's what someone wants to hear. For example, if someone wants you to finish something and asks when it will be done, don't say you'll get around to it soon if you're not sure when you will have time.
**Checking in and out.**
Our checkins stream allows everyone in the organization to be aware of who is working on what. It also gives each of us a sense of accountability. It's very important to be honest, even if you didn't get that much done today--don't worry, everybody has bad days!
By having an accurate record of what you've done, you can look back and see if you forgot someting important from earlier in the week, or congratulate yourself if you got a lot done.
Being honest and open about our productivity helps us to find ways to improve ourselves, both individually and as a team.
**Inclusive communication.**
We try to avoid having conversations about company decisions (technical issues, operations, etc) in private mediums. Instead, they should be held in our openly-accessible zulip channels. Open-source organizations all around the world practice this because it makes it easier for everyone to see what's going on, and for concerns to be noticed addressed early before they become bigger problems. It also allows anyone with expertise in the area to review and comment.
If chats are scattered across 5 different services, it's also hard to come back and piece it all together to read the discussion fluidly.
## <a name="feedback">2. Feedback</a>
*We believe that people are happier, and more productive when they feel free to give each other feedback, and welcome it in return. Critical deliberation is a difficult skill that takes practice. Here are some of our ideas on how to approach giving and receiving.*
### <a name="how-to-receive-feedback">How to receive feedback</a>
**Every argument is a search for the best answer to some question.**
Agreeing on the question, and then figuring out the correct answer is the essence of deliberation. If you enter an argument with the intention of "winning" it, or with the goal of convincing the other person you're right, you are aiming at the wrong target.
Instead, think of it as a shared search for the best solution. The first step is to validate the critique together, and find a shared set of starting assumptions. For example:
*Max: Why is split_path calculated at the reducer? It looks like it belongs in the Animation constructor instead.*
*Nick: I put it there because if you add it to the Animation constructor then any custom Animation object needs to also implement a split_path.*
*Max: Oh, I see. Well the problem is that I'm trying to unit-test the processing, which relies on the path being split, and we probably don't want to have to set up a whole reducer just for that.*
*Nick: Testability is nice. I wonder if there's a way we can have our cake and eat it too. How about just pulling that step out into its own function and importing just that in the test?*
Nick doesn't try to convince me that his way was the "right" way. Instead, he states the concrete benefits of his design over my proposal, and within a few sentences we're brainstorming together on the same question: how to get testability into the design without damaging the ergonomics.
**All critique has value.**
Sometimes, criticism can look like a personal attack, feel harsh, or judgmental. But it's important to remember that everyone is on the same team, and that even the harshest-sounding criticism may contain a small treasure of valuable information. Each piece of feedback is also an opportunity to learn about the asker's frame of reference.
Even objectively incorrect feedback is an opportunity from the perspective of the team--if someone offers you a broken solution to a problem, they're shining light onto a misconception in their understanding, and are giving you the chance to help them improve.
**Fit it into the bigger picture.**
Before engaging in a discussion, it helps to think first about what outcome you're trying to achieve. What are your goals for today, this week, this month, and in your career? If someone offers you a piece of feedback, often they're just trying to help you reach one of your goals!
Take this feedback for example: "it might be better if this class were broken out into functions". Changing your code to functions may slow down your work today, but it might save you time later this week, and maybe help the design choices you make for the rest of your career. What may seem like bad feedback in the context of today, often is good feedback when you look at the big picture.
**Quick replies make the whole discussion slower.**
When someone offers feedback, stopping and thinking about it from their point of view will make your answers more convincing. Try to understand the motivation behind offering that feedback. If you frame your reply from their point of view, with their interests in mind, suddently you're not enemies, you're both on the same side working towards a common goal. Make sure to ask clarifying questions if there's any indication of a misunderstanding. If you think they're missing some context, ask them "did you know x, y, and z also affect this?" before assuming they're wrong.
### <a name="how-to-give-feedback">How to give feedback</a>
- Be proactive and take the time to thoroughly understand each others point of view
- Hint to possible solutions instead of giving low-yield negative feedback
- Frame suggestions in terms of your shared goals, lead with questions, be empathetic
**Give feedback before you get frustrated.**
Often, putting off talking about an issue until later makes the problem worse. Small inconveniences can grow into frustration. Talking about things before people get frustrated keeps people on the same page, and no one likes to be surprised by something they never knew was a problem.
**Lead with a question.**
If you think someone has done something wrong, try asking non-accusingly about that thing. If you disagree with a decision, ask why the decision was made that way. Ask if that person considered your alternative, and if they did, try to understand why they chose their way. Often these questions lead to new discoveries on both sides, and in our experience problems discovered together in question-form make everyone more excited to find solutions.
**Offer concrete, positive recommendations.**
In our experience, everything goes smoother if the person offering feedback can describe a few concrete, actionable improvements, instead of listing general problems with the existing work. It can be hard to come up with good examples, but it's easier to identify the benefits of a concrete example, and general feedback can be easily misunderstood. Often 20 minutes spent coming up with a relevant, detailed example accomplishes more than 1 hour spent debating general ideas.
On a more theoretical note, the space of possible solutions to any problem is infinite. Therefore, telling someone a solution is bad or wrong doesn't contain much information. If there are a thousand doors and tell me not to go through door #1 I still have 999 doors to think about.
On the other hand, the space of good solutions is very small. Positive feedback is very information-dense, and likely to be much more helpful to the recipient. If there are a thousand doors and you tell me you think door #19 looks like a good option, I now have a single, concrete thing to think about. Even if I don't choose door #19, I might examine that door and learn what it is about it that drew your attention.
**Consider your objective.**
Ask yourself: What is the outcome you hope to achieve, and what is the time/cognitive overhead/emotional investment cost of achieving it? How can you present your feedback in a way that minimizes these costs, and maximizes the benefits? Avoid dragging people into multi-hour debates or bike-shed discussions that wont have a meaningful impact in the long-run, stay focused on achieving your direct objectives and try to minimize the time cost incurred when side-tracking other people's work.
**Be empathetic.**
Excessive criticism can be emotionally draining. People can only deal with so many problems at a time. Everyones' time is limited. Consider these things when approaching someone with feedback.
It's easy to feel attacked if criticism is directed at you personally, so instead, direct criticism at the *specific issue*. Instead of saying "You should have used recursion", try saying "Using recursion here would avoid the problem on line 154". This one is simple and easy to forget, but it's ok, with practice it becomes a habit.
Food helps everything too. It might seem silly, but feedback is much better received right after lunch than at the end of the day when everyone is tired :)
## 3. <a name="trust-and-verify">Trust and Verify</a>
*In order for a team to work well together, there must be complete trust. But blind trust isn't good either: verification processes reduce the likelihood of mistakes, which in turn increases the trust teammates can have in one another. Here is a list of principles with enable trust.*
### <a name="trust-and-be-trustworthy">Trust (and be trustworthy)</a>
**Be mindful of workflow dependencies.**
Make sure that others can rely on you, particularly in situations where their work depends on you in some way. If you say you will do something by some date, make sure you can actually do it. If you aren't able to get it done, let everyone know as soon as possible. This takes practice, but people will remember you for being reliable if you are honest when you can't make deadlines.
That being said, engineering estimates are notoriously difficult, if you're not sure about a long-term estimate, break the work into smaller tasks that are easier to estimate.
Be aware that others may make decisions based on something you say, and if something you say changes, it may change their plans. For example, something as simple as "I'll be back in 10 minutes" can cause delays in anothers' workflow if they want to ask you a question before continuing on some work, and you don't return. It's not a big deal to have a late lunch, just try to let your team know your plans.
**Assume good intentions.**
If you are frustrated by something someone does (or code someone has written), assume that that person is doing the best they can with the information they have. Often a simple 5 minute chat to see what their motivations are will resolve everything, don't be afraid to ask people questions!
If something is causing you a problem, let whomever is responsible know about your problem--maybe they aren't aware of it. Or maybe they are aware of the problem, but underestimate the consequences. People aren't aware of everyone else at all times, don't assume they caused a problem for you on purpose. Communication helps everything, just walk over and explain your situation.
You can explain the problem from your point of view, but it helps even more if you show you understand their situation and offer a solution that works for both of you.
**Assume competence.**
If you see a problem in some code, assume that whomever caused that problem did so for a reason. Find out why they did it that way--don't assume they were incompetent. Try to offer feedback only after you understand their reasoning.
**Freedom and responsibility.**
We believe that each person is different, and so everyone should have the freedom to choose their own working schedule, approach problems in their own way, etc. We believe that people who are empowered to make their own decisions are better-equipped to grow and become more effective in their work.
It is important to be responsible with that freedom. If you choose to start work at 11am, thats ok, we have plenty of night owls on the team, just make sure you are making this decision because starting at 11am will allow you to be the most effective at work. And remember that you aren't working alone: often, problems can be better solved with real-time communication, and if your schedule doesn't overlap with other people they might not get the chance to have that experience with you.
If you have questions or concerns about your work schedule or commitments, don't hesitate to ask; we want to keep you and your family happy.
### <a name="verification">Verification</a>
**Review everything.**
All code must be reviewed before it is checked-in, two pairs of eyes catch problems better than one. Strategic decisions must also be OK'd as a team before we commit to them.
We also like to habitually review past decisions over time, everything deserves at least two perspectives: one in real-time, and one in hindsight.
**Monthly retrospectives.**
We like to have everybody in the company do a bi-weekly or monthly meeting to reflect on past work and see what we can do better. Each of us takes some time to aggregate a list of our accomplishments over the past two weeks, and then consider both our strengths and shortcomings. Finally, we come up with specific points upon which we hope to improve over the coming two weeks. Over time, this becomes a catalogue of progress, and the regular, explicit self-examination can really help us push ourselves to get better.
**Question all assumptions.**
If you are depending on something someone is working on, make sure they are aware of that dependency--don't just assume they will get it done. People also work better when they know the thing they're working on will be useful to someone else!
Any time you are surprised by something, question what assumption you made that led you to being surprised. For example, if a bug breaks code you thought was working correctly, don't just fix it and move on, spend some time to figure out why it was wrong. Could better testing allow you to feel confident this kind of mistake won't happen again?
## 4. <a name="be-nice">Be nice</a>
*Sometimes it's easy to make things unpleasant for other people, without meaning to do so. A pleasant working experience is paramount to us at Monadical, and here are some ways that we try to achieve that.*
**Try to make working with you a happy experience.**
Positive feedback (I think x was good!) is not only more information-rich than negative feedback, it also makes people feel good. Remember to encourage people! People love hearing compliments, especially if it's for something you've seen them genuinely improve at.
More generally, try to avoid doing things that other people find unpleasant, and try to actively do things that make other people smile.
**Your happiness is ultimately your responsibility.**
If you are unhappy for whatever reason, remember that ultimately you are the one in control of your emotions. It is good to inform someone that something they are doing is upsetting, but it is not ok to make your feelings their responsibility. For example, don't say "I'm upset because of that thing you said," instead say "I think the thing you said was inconsiderate for xyz reason". The difference is that *I'm upset* is not something they can control, but *inconsiderate* is.
But, regardless of other peoples' behavior, your reaction is up to you. If someone does something that is irritating, you can choose to let it affect your mood, and your work, or you can choose to address it calmly, ignore it, or escalate and inform one of the founders. It's important to consciously separate the things that are in your control from the things that aren't, and take personal responsibility for the former.
**Escalate the medium, not the tone.**
Assume that if someone is not answering you, it is either because they are too busy to answer, or haven't seen your message. It is not because you aren't important to them.
If someone isn't answering you via email, send them a message on zulip or give them a call. If that doesn't get their attention, and what you need is especially urgent, contact someone you know is with them.
**Don't well-actually**
Often, when discussing an issue, someone will say something that is technically incorrect, but also irrelevant to the discussion. These sentences will usually start with "well, actually..." For example:
*Max: I don't like putting both 'id' and 'short_id' in this JSON on line 102.*
*Nick: Well, actually, that's not JSON, it's a dict that gets turned into JSON later.*
It's tempting to correct minor unrelated mistakes people say while talking, but it is distracting from the main point.
**Don't act surprised or outraged**
If someone doesn't know something that you know, it's an opportunity for you partake in the joy of teaching! Avoid acting shocked that they don't know it, even you are legitimately surprised. Treat the person with compassion, so that they feel happy to have learned something new, and not ashamed that they didn't know it already.
Similarly, if someone disagrees with you, assume that they either have a reason, or don't understand something that you do. In the former case, ask questions and try to understand their perspective. In the latter, help them understand yours. In both cases, acting surprised or outraged that their opinion is different will slow the process of finding agreement or a solution.
**Don't backseat-drive.**
If two people are discussing something, it can be disruptive and rude to throw in your opinion from across the room without understanding the full context. Don't half-participate in a conversation: if you want to join in a conversation others are having, be prepared to lend your full attention to it.
**No subtle -isms.**
It does not feel good to be treated differently for something that is completely outside your control, like race, gender, sexuality, or social background. And even if someone doesn't identify with a group doesn't mean it won't affect them.
However, subtle racism, sexism, homophobia, etc can happen even without intention, so we make an active effort to avoid these things.
If you notice anything that falls into an -ism category, you can point it out to the relevant person, either publicly or privately, or you can speak to one of the founders about it. Make sure to point to the problem ("comment x was homophobic") and not the person ("person x is homophobic").
It should go without saying that direct -isms are also not ok.
**Everyone makes mistakes.**
Remember that it's easy to break any of our rules by mistake, and it shouldn't be a big deal in most cases: we just apologize and move on.
## 5. <a name="professionalism">Professionalism</a>
*We're a small company now, but we have big ambitions, and to achieve great things we'll need to be the best at what we do. Here are some ways in which we strive to be great.*
**Time is precious.**
We spend a lot of time thinking about how to make the most of every moment spent working. Our lives are short, and we value free time and balance. In order to lead a healthy, balanced lifestyle, we need to use our time as effectively as possible.
We've found that things like getting exercise and sleeping well can help a lot. Also, we've found that having an explicit separation between working and free hours, and staying focused on work during work hours helps a lot. We've found that check-ins help with this.
**A big wall is made of many little bricks.**
Remember that great things are achieved one small piece at a time. If we make a small, incremental step each day towards a larger goal, sometimes we're shocked to see how far we made it a month, or a year later.
Sometimes a problem feels too big to tackle, and we end up getting frozen trying to figure out where to start. If your problem seems to big, try talking to someone about a small piece of it, and see how much of that small piece you can fit into the bigger picture. It's a lot easier to get something done if you only have to think about a little part of it at a time.
**A true master is forever a student.**
Excellence in any field involves consistent, deliberate practice. We strongly value self-improvement and learning at Monadical at every level of abstraction. We love to take the time to examine the way we talk to one another and think about how we can interact more efficiently. We're always reading about new technologies and sharing the things we discover with one another. We love to re-examine our work, even when it's good, and think about how it could be better.
---
## Further Reading
- [How to Make Remote Work: Part 1](https://monadical.com/posts/how-to-make-remote-work-part-one.html)
- [How to Make Remote Work: Part 2 - Company chat as a self-organizing Knowledge Management platform.](https://monadical.com/posts/how-to-make-remote-work-part-two-zulip.html)
- [Zapier's guide to working remotely](https://zapier.com/learn/remote-work/)
- [Everyone Should Read Customer Support Emails](https://blog.usejournal.com/why-everyone-should-read-support-emails-42ca2172e23e)
- [Assuming Positive Intent](http://mindingourway.com/assuming-positive-intent/)
- [GitLab Communication](https://about.gitlab.com/handbook/communication/)
- [Thinking about software engineering](https://nintil.com/programming)
- [Bridgewater Principles & Culture](https://inside.bwater.com/publications/principles_excerpt)
- [Reef Technologies Handbook](https://github.com/reef-technologies/handbook)</div>
<div class="ui-toc dropup unselectable hidden-print" style="display:none;">
<div class="pull-right dropdown">
<a aria-expanded="false" aria-haspopup="true" class="ui-toc-label btn btn-default" data-toggle="dropdown" href="https://docs.monadical.com/#" id="tocLabel" role="button" title="Table of content">
<i class="fa fa-bars"></i>
</a>
<ul aria-labelledby="tocLabel" class="ui-toc-dropdown dropdown-menu" id="ui-toc">
</ul>
</div>
</div>
<div class="ui-affix-toc ui-toc-dropdown unselectable hidden-print" data-spy="affix" id="ui-toc-affix" style="display:none;"></div>
</body>
</html>
<script src="https://docs.monadical.com/js/mathjax-config-extra.js"></script>
<script defer="" src="https://docs.monadical.com/build/MathJax/MathJax.js"></script>
<script defer="" src="https://docs.monadical.com/build/MathJax/config/TeX-AMS-MML_HTMLorMML.js"></script>
<script defer="" src="https://docs.monadical.com/build/MathJax/config/Safe.js"></script>
<script src="https://docs.monadical.com/config"></script><script defer="defer" src="https://docs.monadical.com/build/vendors~common.416b1eda8a25bde937d8.js"></script><script defer="defer" src="https://docs.monadical.com/build/common.7571c5f3816940134570.js"></script><script defer="defer" src="https://docs.monadical.com/build/vendors~cover~cover-pack~index~index-pack~pretty~pretty-pack~slide~slide-pack.f63651c51059baff7257.js"></script><script defer="defer" src="https://docs.monadical.com/build/vendors~index~index-pack~pretty~pretty-pack~slide~slide-pack.ee48259a734d6fa119fa.js"></script><script defer="defer" src="https://docs.monadical.com/build/pretty-pack.12f46fc3d4cfbda8d879.js"></script>
</article>
</div>
</div>
</div>
<div class="container">
<div class="authorbox">
<div class="authorbox__content">
<img src="/static/max.jpg" alt="Max"/>
<div>
<h3><a href="/team.html" target="_blank" rel="noopener">Max</a></h3>
<h5> is a Co-Founder of Monadical</h5>
</div>
</div>
</div>
<div class="recent-posts">
<h4>Recent posts</h4>
<ul>
<li><a href="/posts/vibe-code-how-to-stay-in-control.html">Vibe code isn't meant to be reviewed *</a></li>
<li><a href="/posts/The-scraping-with-cookies-dilemma.html">The Scraping-With-Cookies Dilemma</a></li>
<li><a href="/posts/conversations-are-the-new-oil.html">Conversations are the New Oil</a></li>
<li><a href="/posts/don't-give-big-tech-your-papaya.html">Don't Give Big Tech Your Papaya</a></li>
<li>
<a href="/blog.html">
View more posts...
</a>
</li>
</ul>
</div>
<script src="https://utteranc.es/client.js"
repo="Monadical-SAS/monadical.com"
issue-term="pathname"
label="blog"
theme="github-light"
crossorigin="anonymous"
async>
</script>
<center>
<a href="#post-content" class="back-to-top">
Back to top <i class="fa fa-arrow-up"></i>
</a>
</center>
<!-- Final CTA -->
<div class="row final-cta">
<div class="col-12 text-center">
<h2>Let's <span class="highlight">transform</span> your organization.</h2>
<a href="/contact-us.html" class="btn btn-primary cta-button">BOOK A FREE AI STRATEGY CALL</a>
</div>
</div>
</div>
<script type="text/javascript" id="MathJax-script" async
src="https://cdn.jsdelivr.net/npm/mathjax@3/es5/tex-mml-chtml.js">
</script>
<script>
// hide the table of contents nav when you scroll down past the end
$(window).scroll(function() {
const pos = $(window).scrollTop()
const threshold = $('.authorbox').position().top - 250
$('#ui-toc-affix').css({
opacity: (pos > threshold) ? 0 : 1
});
$('.pull-right').css({
opacity: (pos > threshold) ? 0 : 1
});
});
document.addEventListener('DOMContentLoaded', () => {
document.querySelector('#ui-toc-affix > div.toc-menu > a.go-to-bottom').innerHTML = 'Go to comments'
document.querySelector('#ui-toc-affix > div.toc-menu > a.go-to-bottom').href = '#post-footer'
document.querySelector('#ui-toc-affix > div.toc-menu > a.back-to-top').innerHTML = 'Go to top'
document.querySelector('#ui-toc-affix > div.toc-menu > a.back-to-top').href = '#post-content'
// Popup toc for samll screens
document.querySelector('#ui-toc > div.toc-menu > a.go-to-bottom').innerHTML = 'Go to comments'
document.querySelector('#ui-toc > div.toc-menu > a.go-to-bottom').href = '#post-footer'
document.querySelector('#ui-toc > div.toc-menu > a.back-to-top').innerHTML = 'Go to top'
document.querySelector('#ui-toc > div.toc-menu > a.back-to-top').href = '#post-content'
// GET the original article source so they get they bump the view counter
fetch('https://docs.monadical.com/s/principles-handbook', {mode: 'no-cors'})
// remove undesired css that break styles
setTimeout(() => document.querySelector("link[href*='pretty-styles-pack']").remove(), 500)
})
$('[href$="bootstrap.min.css"]').attr('disabled', 'disabled')
</script>
<script>
function setOpacity(){
const maxWidth = 1140;
const width = $(window).width();
$('#post-cube-left').css({
opacity: (width < maxWidth) ? 0.1 : 0.6
});
$('#post-tentacle-right').css({
opacity: (width < maxWidth) ? 0.1 : 0.6
});
}
$(document).ready(setOpacity);
$(window).resize(setOpacity);
// Remove undesired bootstrap styles
setTimeout(() => {
$('[href$="bootstrap.min.css"]').attr('disabled', 'disabled');
document.querySelector("link[href*='pretty-styles-pack']")?.remove();
}, 500);
</script>
</div>
</article>
<footer>
<div class="container footer">
<div class="row">
<div class="col-12 col-md-4">
<ul>
<li><b title="Montréal, Canada">Montréal</b></li>
<li><b title="New York, USA">New York</b></li>
<li><b title="San Francisco, USA">San Francisco</b></li>
<li><b title="Vancouver, Canada">Vancouver</b></li>
<li><b title="Medellín, Colombia">Medellín</b></li>
</ul>
</div>
<div class="col-12 col-md-3">
<ul>
<li>
<b>Monadical</b>
</li>
<li><a href="/blog.html">Blog</a></li>
<li><a href="/services.html">Services</a></li>
<li><a href="/projects.html">Projects</a></li>
<li><a href="/privacy.html">Privacy Policy</a></li>
</ul>
</div>
<div class="col-12 col-md-3">
<ul>
<li>
<b>About Us</b>
</li>
<li><a href="/about.html">About</a></li>
<li><a href="/team.html">Team</a></li>
<li><a href="/principles.html">Principles</a></li>
</ul>
</div>
<div class="col-12 col-md-2">
<ul>
<li>
<b>Contact Us</b>
</li>
<li><a href="https://cal.com/monadical/widget">Get a Quote</a></li>
<li><a href="https://careers.monadical.com/">Careers</a></li>
<li><a href="/contact-us.html">Contact us</a></li>
</ul>
</div>
</div>
<div class="row social">
<div class="col-12">
<ul>
<li>
<a href="https://twitter.com/MonadicalHQ" title="Monadical Twitter" target="_blank"
rel="noopener">
<i class="fa fa-twitter"></i>
</a>
</li>
<li>
<a href="https://facebook.com/monadical" title="Monadical Facebook" target="_blank"
rel="noopener">
<i class="fa fa-facebook"></i>
</a>
</li>
<li>
<a href="https://linkedin.com/company/monadical" title="Monadical LinkedIn" target="_blank"
rel="noopener">
<i class="fa fa-linkedin"></i>
</a>
</li>
<li>
<a href="https://github.com/Monadical-SAS" title="Monadical Github" target="_blank"
rel="noopener">
<i class="fa fa-github"></i>
</a>
</li>
</ul>
</div>
</div>
</div>
</footer>
<script type="text/javascript">
// hide all the tags containing fake contact info that are there to throw off scrapers
// most scrapers dont run JS, so this fairly effectively masks our real info from bots
for (const elem of document.querySelectorAll('.please-scrape-this-fake-info')) {
elem.style.display = 'none'
}
</script>
<script src="/static/squares.js"></script>
<!-- Smooth Scroll to Anchor Links Animation -->
<script>
function getUnicodeHash(reference) {
return "#\\" + reference.codePointAt(1).toString(16) + " " + reference.slice(2)
}
function smoothScroll(e) {
const hash = decodeURIComponent(this.hash)
e.preventDefault()
e.stopPropagation()
console.log('Scrolling to', this.getAttribute('href'))
let reference = this.getAttribute('href')
if (reference.match(/^#[0-9]+/)) {
reference = getUnicodeHash(reference)
}
document.querySelector(reference).scrollIntoView({
behavior: 'smooth'
});
setTimeout(() => {
window.location.hash = hash
}, 500/*arbitrary value, not standartized*/);
}
document.addEventListener('DOMContentLoaded', () => {
document.querySelectorAll('a[smoothhashscroll]').forEach(elem => {
/*
this code drops all the event listeners that were attached so far;
we need to do it here because the event listeners themselves are not under control of this repo
this content together with js files (that are executed) is presumably downloaded from hedgedoc
this is a very hacky hack, we shall negate it "as soon as we can"
*/
elem.parentNode.outerHTML = elem.parentNode.outerHTML
})
document.querySelectorAll('a[href^="#"], a[smoothhashscroll]').forEach(anchor => {
anchor.addEventListener('click', smoothScroll);
});
})
</script>
<!-- Matomo -->
<script type="text/javascript">
var _paq = window._paq || [];
/* tracker methods like "setCustomDimension" should be called before "trackPageView" */
_paq.push(["setCookieDomain", "*.monadical.com"]);
_paq.push(['trackPageView']);
_paq.push(['enableLinkTracking']);
// accurately measure the time spent in the visit
_paq.push(['enableHeartBeatTimer']);
(function () {
var u = "//analytics.zervice.io/";
_paq.push(['setTrackerUrl', u + 'matomo.php']);
_paq.push(['setSiteId', '12']);
var d = document,
g = d.createElement('script'),
s = d.getElementsByTagName('script')[0];
g.type = 'text/javascript';
g.async = true;
g.defer = true;
g.src = u + 'matomo.js';
s.parentNode.insertBefore(g, s);
})();
</script>
<!-- End Matomo Code -->
<!-- Highlight Code -->
<script src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.4.0/highlight.min.js"></script>
<script>hljs.highlightAll();</script>
<!-- End Highlight Code -->
</body>
</html>