teleren/devto huggingface dataset:
型安全の夢を一行で打ち砕く黒魔術入門
Tags: reason, ocaml
Published: 2020-01-23 16:13:43

※この記事は 2018年01月13日 に Qiita に投稿したものです。

※Reason 向けですが OCaml とほぼ共通します。

---


ドキュメントを眺めていて、[こんな記述を見つけました。](https://reasonml.github.io/docs/ja/type.html)

> 型システムは完全に「安全」です。 これは、コードがコンパイルされている限り、すべての型に誤りがないことが保証されることを意味します。 従来のベストエフォートな型システムでは、例えば「Integer は決して null にならない」と言っていたとしても、言っているだけで、本当に決して null にならないということではありません。 それとは対照に、純粋な Reason プログラムは null のバグはありません。

私は型理論に明るくないので「型の完全性」が何を示すのかはわかりませんが、型安全の抜け道は知ってます。私だけでなく、 OCaml ユーザーならわかるでしょう。

それは [Obj.magic](https://reasonml.github.io/api/Obj.html) という関数です。この関数の型はこう定義されています。

```
let magic: 'a => 'b;
```

これを見て笑った人は、この記事を読む必要はありません。もうわかったはずです。

なんだこりゃ？と思った方は、一つ冷静になって考えてみてください。この関数は、 **任意の型 'a を、任意の型 'b に変換** します。当然ながら、 'a と 'b は同じ型である必要はありません。 'a が int で 'b が bool でもいいわけです。

この型の関数の実装を考えてみてください。処理内容はどうでもいいものとします。関数の型が ``'a => 'b`` になれば OK です。

例えば、 int を bool に変換する関数は簡単に書けるでしょう。処理内容はどうでもいいので、単に true を返すだけでも構いません。次に、 int を任意の型 'b に変換する関数はどうでしょうか。もちろん 'b は関数が呼び出される文脈によって変わります。 'b は bool かもしれませんし、 string かもしれません。

```
let f = (value: int) : 'b => {
  /* どうする？ */
};
```

何か思いつきます？ 無理じゃないですか？ 任意の型を戻り値にするとはどうすればいいのか。任意の型を生成するとは？ int 値を任意の値に変更する？ どうやって？

Obj.magic はどうにかしちゃいます。型の上では任意の型 'a を任意の型 'b に変換します。ただし、 Obj.magic は何もしません。引数の値をそのまま戻り値にします。型だけが変わります。つまり、 int の値を string として扱えるようになります。

```
/* 見た目は文字列、中身は整数！ */
let f = (a: int) : string => Obj.magic(a);

/* 文字列の長さを表示する */
Js.log(String.length(f(123)));
```

[オンライン](https://reasonml.github.io/en/try.html)でこのコードを入力してみてください。出力には ``undefined`` と表示されるはずです。

出力される JavaScript のコードを見ればはっきりわかります。

```javascript
// Generated by BUCKLESCRIPT VERSION 1.9.2, PLEASE EDIT WITH CARE
'use strict';


function f(a) {
  return a;
}

console.log((123).length);

exports.f = f;
/*  Not a pure module */
```

整数 ``123`` は ``length`` プロパティを持っていないので結果は ``undefined`` です。 Reason の型検査をすり抜けてしまいました。ちなみに OCaml の出力だと ``Obj.magic`` が残ります。元々 OCaml のライブラリの API なので。

```ocaml
let f (a : int) = (Obj.magic a : string)
let _ = Js.log (String.length (f 123))
```

``Obj.magic`` はどうしても使わなければならない場面があり、実際に [ReasonReact](https://github.com/reasonml/reason-react/search?utf8=✓&q=obj.magic&type=) でも使われています。普通は使いませんし推奨もしませんが、 ``Obj.magic`` を使っているライブラリは型検査をすり抜けたバグを含む可能性がある、ということを頭の隅に置いておくと、いざというときにデバッグにかかる時間を削減できるかもしれません。
Launch of Batch 2 for JuniorDev Singapore Mentoring Program
Tags: beginners, webdev, python, discuss
Published: 2020-01-23 16:12:59

# Introduction
![Photo by Pablo Heimplatz on Unsplash](https://thepracticaldev.s3.amazonaws.com/i/x6fqgmtacr4nz8x0ksju.jpeg)

I'm happy to announce that we just open up for our **2nd batch** of the [JuniorDevSG](https://www.meetup.com/Junior-Developers-Singapore/) mentoring programme. 

For those who don't know, I'm part of the organising team for JuniorDev Singapore's mentoring programme. 

I will be mentoring Junior Developers again, who are interested in **Startups** or looking to embark their journey as a **Python** developer.

# Spread the Message
Do spread it around if you know of anyone in **Singapore**, who will be interested to be either a **mentor** or **mentee** in the programme.


# Further Details 
If you would like to know more about the **JuniorDevSG Mentoring program** you can head down to this [link](https://bit.ly/2Gekbpo).
 

## Signup as a Mentee
https://lnkd.in/fZq-QFy

## Signup as a Mentor
https://lnkd.in/f7sX3FV

# Conclusion
I hope to see you soon from you, wonderful people who are looking to make a difference for Junior Developers and the aspiring developers who are seeking to break into the developer space in Singapore. 

As usual, I will be providing **summaries** for each mentor session. For documenting to **mentors**, **mentees** to review and reflect in the programme.

This is also for those who are looking to start their own mentoring programme in their own organisation to help Junior Developers to eventually become a **tech lead**.
"type t" とは何か
Tags: reason, ocaml
Published: 2020-01-23 16:11:05

※この記事は 2018年01月12日 に Qiita に投稿したものです。

※Reason 向けの内容ですが、 OCaml とも共通します。

---

Reason で書かれたコードを見ていると、ところどころで ``type t`` という一文字の型名を目にします。[例えばこういうの](https://github.com/reasonml/reason-react/blob/36135bfb8905e99fea24224947adb89af40ffed1/src/ReactEventRe.rei#L43):


```
module Synthetic = {
  type tag;
  type t = synthetic(tag);
  ...
}
```



これは [1モジュール1データ型主義](http://d.hatena.ne.jp/camlspotter/20121216/1355686499) という OCaml の一慣習から来ています（いると思われます）。

[Reason のドキュメントにレコード定義の一例があります。](https://reasonml.github.io/docs/en/record.html#record-types-are-found-by-field-name)


```
type person = {age: int, name: string};
type monster = {age: int, hasTentacles: bool};
```

どちらのレコードも ``age`` という同名のフィールドを持ちます。 Reason のレコードは名前空間が独立しておらず共有されるため、型推論時の ``person`` と ``monster`` の区別はフィールド名の組み合わせで判断されます。レコードの生成時に ``name`` フィールドがあれば ``person`` 型、 ``hasTentacles`` フィールドがあれば ``monster`` 型と判断されます（[もちろん明示的にレコード型を指定することもできます](https://reasonml.github.io/docs/en/record.html#record-needs-an-explicit-definition)）。

```
/* person */
let me = {age:100, name:"me"};

/* monster */
let me = {age:100, hasTentacles:true};
```

では、まったく同じフィールドを持つレコード型があったらどうでしょうか。

```
type person = {age:int, name:string};
type monster = {age:int, name:string};

/* どっちのレコード？ */
let me = {age:100, name:"me"};
```

特に型の指定がなければ、フィールド名では型を判断できません。このような場合、 Reason では最後に定義された型とされます。 ``me`` は ``monster`` 型です。

ですので、次のように ``person`` を引数に受け取る関数に ``me`` を渡すと型エラーになります。

```
let me = {age: 100, name: "me"};

/* person 型の引数を取るだけで何もしない関数 */
let f = (who: person) => ();

f(me);
```

コンパイルエラー:

```
  13 │ let f = (who: person) => ();
  14 │ 
  15 │ f(me);
  
  This has type:
    monster
  But somewhere wanted:
    person  
```

``me`` は ``monster`` 型だと判断されました。この場合は ``me`` の型を ``person`` と明示的に指定すれば大丈夫です。

```
let me: person = {age: 100, name: "me"};
```

~~OCaml だとフィールド名が重複すればコンパイル時に警告されます。 Reason の唯一の工夫のように見えますが、かえって落とし穴ができてしまった気もします。~~

ただし、既存のレコードとフィールド名が重複していると警告 42 で注意されます。 (デフォルトの警告の設定では無効です)

```
   9 │ };
  10 │ 
  11 │ let me:person = {age: 100, name: "me"}; // ``age`` の部分がハイライトされる
  12 │ 
  13 │ let f = (who: person) => ();
  
  this use of age required disambiguation
```

ここで元の問題に戻ります。以上の通りレコードは名前空間にならないので、フィールド名が重複する複数のレコードを定義する場合は、フィールド名に適当な接頭辞をつければ問題は回避できます。でも ``person_age`` や ``monster_age`` といちいちやるのはあまりかっこよろしくない。だからそれぞれのレコード型に専用のモジュールを用意すればフィールド名の重複を気にかけなくていい:

```
module Person = {
  type t = {
    age: int,
    name: string
  };
};

module Monster = {
  type t = {
    age: int,
    name: string
  };
};
```

このときに使う型名が ``t`` です（"type" の "t" かな？）。かつてのレコード ``person`` と ``monster`` はそれぞれ ``Person.t`` と ``Monster.t`` として定義されます。 ``t`` とつく型は、そのモジュールの中心的なデータ型だとわかります。インターフェースファイルである `.rei` と ``t`` を探せば、 API のだいたいの意味が推測できます。

以上です。 Reason は OCaml を丸ごと新しい文法で覆っただけなので、 OCaml の不便な点も、不便を解消するためのイディオムもそのまま引きずっています。改善すべき点は文法以外にもあるんじゃないですかね...
ゼロから始める OCaml
Tags: ocaml
Published: 2020-01-23 15:24:29

※この記事は 2014年03月08日 に Qiita に投稿したものです。

※追記：オンラインで OCaml 含む様々なプログラミング言語を試せる [Wandbox](https://wandbox.org) というサービスがあります。強力な基礎ライブラリの [Jane Street Core](https://opensource.janestreet.com/core/) も使えるので、そちらを使うとこの記事はほぼ無意味です。

---

OCaml に興味津々のみなさんこんにちは、 OCaml ビギナーです。さて、 OCaml とは（ry

ググればわかるような説明はさておき、そこのあなた、 "Ocaml" とキーを叩いてググる暇があるなら（あっ、 **"OCaml"** でした！）、いますぐターミナルを開いて `brew install ocaml` しましょう。やれってば。案ずるより産むが易しと言うではありませんか（ Windows でしたか？ [残念ながら Windows での OCaml は茨の道のようです。] (https://bitbucket.org/camlspotter/ocaml-zippy-tutorial-in-japanese/src/7e5943ed17edf58f370c34feeb218a30cc09143f/random_memo.rst?at=default#rst-header-ocaml-unix)なんとか Unix 環境を用意してください）。おや、「 OCaml は仕事で使えるの？」「関数型言語って難しいんじゃない？」という心の声が聞こえましたが、アーアーキコエナーイ。はいはい、ググるだけ無駄です。どこを探しても、今のあなたの役に立つ情報なんかありませんよ？（おっと、誰か来たようだ）

...

はい、 `brew install ocaml` しましたか？ してない？ しないの？ なんで？ ああ、インストール済みでしたか、早く言ってくださいよ（ちなみに OCaml の最新バージョンは、これを書いている時点で 4.01.00 です）。じゃあ、次にビルドツールの OMake をインストールするために `brew install omake` して...あっ、 Homebrew に OMake なかった...。もし手間を惜しまないなら [OPAM という OCaml 用のパッケージ管理ツールをオススメします] (opam ocaml)が、セットアップが終わるまでになかなか時間を食います。私のような環境構築をめんどくさがるタイプのビギナーにとっては、これが意外と生きる気力をスポイルするんですよね。技術者たる者、そんなこっちゃいかんと日々思っているのですが。まあ準備運動で力尽きないためにも、最初はインタプリタと標準ライブラリだけで学んでもいいでしょう（コンパイラもあります。後述）。

では、 5 分もあればできる恒例の Hello, world にトライしたいと思います。え？ 手垢のついたつまんねーサンプルはやめろ？ いやいや、ビギナーってのは Hello, world と出力するまでの手順すらわからないからビギナーなんです。どんな言語でも、まずはそこから調べないとね。というわけで、 `main.ml` という名前でファイルを作って、次のコードをコピペしてください。

```main.ml
let () = Printf.printf "Hello, world!\n"
```

あれ？ Qiita のシンタックスハイライトに OCaml がないよ？（このハイライトは Haskell らしい）まあいいや、このファイルを `ocaml` の引数に渡して実行してみましょう。

```
$ ocaml main.ml
Hello, world!
```

出力されました！やったね！

...これでおしまいにしちゃうと不親切ですかね。ぱっと見て、次の疑問が頭に浮かんだかと思います。

* `let () =` とは何ぞや？
* OCaml はインタプリタなの？

`let () =` とは何か？ あー、うん、気にしなくていいです。この右辺にコードを書いておくと、プログラムの起動時に実行されるとだけ覚えておけばいいです。

`ocaml` コマンドは<del>インタプリタですが</del>（[インタプリタとは言わないとツッコミ頂きました] (https://twitter.com/camloeba/status/442989900669800448)）[トップレベル対話環境] (http://ocaml.jp/Chapter%209%20トップレベル対話環境%20(ocaml))で、引数にファイルを指定すると面倒なビルド手続きなく実行してくれます。ただ OCaml にはネイティブコードコンパイラ `ocamlopt` も用意されているので、実際の開発ではこちらを使います。実行速度が違いますからね。その他にバイトコードコンパイラ `ocamlc` も含まれているのですが、まあ触ってみる程度なら `ocaml` を、通常の開発では `ocamlopt` を使えばいいんだと思います。[続きは Web で！] (http://d.hatena.ne.jp/camlspotter/20121204/1354588576)

さあ、これで OCaml プログラムを動かす方法を一つ覚えました。明日からは好き放題 OCaml を書けますね。うん？ main.ml が膨らんだときにファイルを分割するにはどうすればいいかって？ そうですねえ、そこまで困ってから考えればいいと思いますよ。
Just Received my HactoberFest T-shirt 
Published: 2020-01-23 16:04:24

---
title: Just Received my HactoberFest T-shirt 
published: true
description: 
tags: 
---

I'm glad my shirt finally arrived in Ghana. Thanks to digital Ocean for the motivation they gave me towards learning git as well as how to contribute to open source submitting . It was fun and a good feeling.

![Mudasir's  hacktoberfest T-shirt](put-link-to-image-here)

#Hacktoberfest
#Dev.to
What do you think the dev.to feed algorithm should be?
Tags: discuss, meta
Published: 2020-01-23 15:42:36

---
title: What do you think the dev.to feed algorithm should be?
published: true
description: 
tags: discuss, meta
---

I dove into the code to find out what it is now.

{% link https://dev.to/piannaf/the-dev-to-feed-algorithm-5em5 %}

It's been changed a few times in the past.

What do you think of it? Do you have suggestions for what would work better for you?
Somersault Problems
Tags: problemsolving
Published: 2020-03-15 11:23:03

---
title: Somersault Problems
published: true
date: 2020-01-23 15:26:10 UTC
tags: problem-solving
canonical_url: 
---

![](https://cdn-images-1.medium.com/max/1024/0*7joYV-ubN3qdYSpF)<figcaption>Photo by <a href="https://unsplash.com/@churrbroskii?utm_source=medium&amp;utm_medium=referral">Liam Shaw</a> on <a href="https://unsplash.com?utm_source=medium&amp;utm_medium=referral">Unsplash</a></figcaption>

I’ve run into a few problems recently that I felt had a common denominator that I couldn’t quite put my finger on. When it clicked, I thought I’d write something down just to solidify the idea in my head. I call it _somersault problems._ There may be a more formally (or colloquially) defined term but I am not aware of it, so this is what I’m going with. I also considered _uphill bicycle problems_, but somersaults seemed more fun.

![](https://cdn-images-1.medium.com/max/210/1*6OUve-O7RSjrMkf9dpjsfA.png)

The gist is: the problem is of such a nature that if you start, you better commit to solving it fully in one go, or you are better off not starting at all. The progress indicator is one bit, not a floating point or even discreet number.

Normally, the best way to attack any problem is in a divide and conquer-fashion. Solve as little as possible, reassess your situation based on the feedback received and repeat.  
Every now and then, however, you run into something where this strategy can’t be applied. You wanted to introduce a tiny bit of const correctness in your new code but because your wonderful programming language has proper transitivity, the compiler refuses everything until you’ve changed practically the entire code base. Or you thought you’d just update Webpack to the newest version, but found that it came with a slew of derivative dependency updates that now require you to fix all kinds of weird new bugs.

These situations are bad because no improvement can be obtained before everything is solved, but they do have a redeeming quality: they can be rolled back. Git saves us, we have the option to realize half-way that we’d rather not bother. The worst type of somersault problem is the one that can’t easily be undone if half-way completed. Like destructive database migrations in a live system. Or moving to a new house. Or changing the name of the company (which is, in my experience, an order of magnitude more involved than one would imagine).

Should you avoid problems that are somersaulty? Well sure, if you can. Or not. Sometimes, you just can’t. I am hoping that with this term, I will be more likely to spot this trait in a problem and at the very least be aware of the additional stress it will put on your team while blocking the pipeline. And see if there are ways to alleviate the problem by “prepping the ground”. For instance, you could update the Webpack dependencies first. That way, you might be able to reduce it to a mere _roll problem_.
ENOSPC: System limit for number of file watchers reached | Ubuntu | Emberjs
Tags: ember, ubuntu
Published: 2020-01-23 15:23:12

---
title: ENOSPC: System limit for number of file watchers reached | Ubuntu | Emberjs
published: true
description: While using emberjs in ubuntu, sometimes you might face  System limit for number of file watchers reache
tags: ember, ubuntu
---

If you are facing this issues

```
Stack Trace and Error Report: /tmp/error.dump.9d22f10a74fb98f66d5b433d74cf4b9c.log
internal/fs/watchers.js:173
    throw error;
    ^

Error: ENOSPC: System limit for number of file watchers reached, watch '/home/mymachine/ember-app/tests/helpers'
    at FSWatcher.start (internal/fs/watchers.js:165:26)
    at Object.watch (fs.js:1329:11)
    at NodeWatcher.watchdir (/home/home/mymachine/node_modules/sane/src/node_watcher.js:159:22)
    at Walker.<anonymous> (/home/home/mymachine/node_modules/sane/src/common.js:109:31)
    at Walker.emit (events.js:223:5)
    at Walker.EventEmitter.emit (domain.js:475:20)
    at /home/home/mymachine/node_modules/walker/lib/walker.js:69:16
    at FSReqCallback.oncomplete (fs.js:146:23) {
  errno: -28,
  syscall: 'watch',
  code: 'ENOSPC',
  path: 'home/mymachine/tests/helpers',
  filename: 'home/mymachine/tests/helpers'
}
```

while working with emberjs in ubunut? Don't worry! We can fix it. It is just hitting your system's file watchers limit.

To increase the file watchers limit we need to do certain things, first
enter the following command in your terminal

`cat /proc/sys/fs/inotify/max_user_watches`

You might get output like this some integer.
`8192`

Now increase the limit by entering the next command

`echo fs.inotify.max_user_watches=524288 | sudo tee -a /etc/sysctl.conf`

The above command will set your file watcher limit to 524288. To see whether it is set or not, type

`sudo sysctl -p`

*output*
`fs.inotify.max_user_watches = 524288`

Now, again run your ember server and it'll work fine. 

I hope this post is helful to you, if yes then give a heart. Please comment if you have any issues. Do let me know if you need more emberjs related posts.
Survive A Game Jam, 8 tips
Tags: gamejam, gamedev
Published: 2020-01-23 15:17:48

 
![A game arcade room](https://images.unsplash.com/photo-1565700309503-e78580f9f5d8?ixlib=rb-1.2.1&ixid=eyJhcHBfaWQiOjEyMDd9&auto=format&fit=crop&w=1650&q=80)
## 1. Make the Jam Easy

### Estimate Time
- Do you have enough time for the jam? 
- Do you have enough time to build the game you have in your head?

### Join a Team!
- People you know is best
- People you don't know can be fun
- Requires more communication and planning
- You can do many tasks in parallel

### Go Solo!
- Can you do art, sound music and programming?
- Saves time on communication and management
- You might not have time to make all the things

![A gun with a scope](https://images.unsplash.com/photo-1482649671545-bc53dcf1ad7c?ixlib=rb-1.2.1&ixid=eyJhcHBfaWQiOjEyMDd9&auto=format&fit=crop&w=1650&q=80)

## 2. Limit Scope

### Animation
- As little as possible

### Mechanics 
- One or two.

### AI 
- The best AI is none

### Inputs 
- one button game
- point and click
- use standard controls 

### Art 
- Limit colors
- Make shapes more uniform
- have one style

### Sound
- Have a few sounds to cover what you need.
- keep it short and simple

### Music 
- make a few good simple loops

### Code 
- Don't get clever. 
- Keep it small and short. 
- The best code is no code

![A man reading a book](https://images.unsplash.com/photo-1472745433479-4556f22e32c2?ixlib=rb-1.2.1&ixid=eyJhcHBfaWQiOjEyMDd9&auto=format&fit=crop&w=1050&q=80)

## 3. Do what you know

### Design
- Don't build things you have to do a lot of research for
- Build things you know in a new way

### Tools
- Use tools you have used before
- Use tools you are good at

### No Google
 - Don't do things you have to Google a lot for. 
 - Google is for ideas and light debugging

## 4. Use a GDD

### Themes and Limitations
Theme: Water. 
Limitation: No text in the game

### Main Mechanics/ Game Type
Mechanic: swim and collect dirty socks 
Type: Point and Click

### Setting
A friends swimming pool. 

### To Do List
- main title screen
- timer
- point and click work
- art
- sfx
- music
etc

![A track with the finish line](https://images.unsplash.com/photo-1552576949-04e3a68b0a9f?ixlib=rb-1.2.1&ixid=eyJhcHBfaWQiOjEyMDd9&auto=format&fit=crop&w=1600&q=80)

## 5. Start with the end in mind

### Win Cases
- What are they?
- How many?
- Why?

### Lose Cases
- What are they?
- How many?
- Are they interesting??
- How does the game handle losing?

### Main Game
- Make sure players can quit the game
- Make sure players can access settings

### Main Menu
- Start
- How to Play
- Credits
- Quit
- Please Rate our Game

## 6. Be Lean
- Set up your game's web page first
- Publish the simplest version of your game
- Iterate to the next working build and publish.

## 7. Self Management
- Sleep
- Eat
- Take Breaks
- If you need help, ask

![the world cup trophy](https://images.unsplash.com/photo-1527871369852-eb58cb2b54e2?ixlib=rb-1.2.1&ixid=eyJhcHBfaWQiOjEyMDd9&auto=format&fit=crop&w=1489&q=80)

## 8. Win the Jam

- Browser Playable
- Good Banner Image
- Don't skip the music!
- Consistent art style
- Test your builds!
- Make it Juicy
- Ask for a rating!
CSS Dragon Illusion
Tags: codepen, css, showdev
Published: 2020-01-23 14:57:24

---
title: CSS Dragon Illusion
published: true
tags: codepen, css, showdev
---

The [dragon illusion](https://youtu.be/_Q_kSrOVdHw?t=60) built with CSS:


{% codepen https://codepen.io/pomber/pen/povqmoX %}
Create a Quick Cart Panel using CodyFrame
Tags: css, tutorial, codyframe, webdev
Published: 2020-01-23 14:35:04

In case you've never heard of [CodyFrame](https://codyhouse.co/ds/docs/framework), it's a lightweight CSS framework that comes with [200+ accessible components](https://codyhouse.co/ds/components).

In this tutorial, we'll create a quick cart template in a drawer panel.

Final result:
👉 https://codyhouse.co/ds/components/app/cart-drawer

##Requirements
To follow along the tutorial, fork this pen on Codepen:
🕹 [codepen.io/codyhouse/pen/Wqvpmm](https://codepen.io/codyhouse/pen/Wqvpmm)

or download CodyFrame on Github:
- 📦 Framework [github.com/CodyHouse/codyhouse-framework](https://github.com/CodyHouse/codyhouse-framework)
- 🎨 A1 Theme [github.com/CodyHouse/a1-codyframe-theme](https://github.com/CodyHouse/a1-codyframe-theme)

##Video tutorial

{% youtube eljyGXFzRuU %}
Productivity Pixel - Side-project motivation
Published: 2020-01-23 14:30:56

Ideas to stay on track working on your side-project/side-hustle. 

## 1 - Mark your calendar

![Alt Text](https://thepracticaldev.s3.amazonaws.com/i/e5u0wu64yqace9e3ebb9.png)

Bring your side-project as a first-class citizen in your calendar. Blocking dedicated time to work on your side project will help you ensure that progress will be made and keep you accountable to yourself.

## 2 - Don’t work alone

![Alt Text](https://thepracticaldev.s3.amazonaws.com/i/51l4xkx9ftv74v1l56ol.png)

If you already have partners, great! If not, consider doing a work session with a friend at the local coffee shop or consider open-sourcing your project if possible to create a community. 

## 3 - Be S.M.A.R.T

![Alt Text](https://thepracticaldev.s3.amazonaws.com/i/5hi43hcrs6oqhli5hkwp.png)

> Specific, Measurable, Attainable, Realistic, and Time-based

S.M.A.R.T goals are all the rage these days. And there is a good reason for it: they really help you reach your goals! Set S.M.A.R.T goals as milestones in your project to make steady progress and keep track of it.

## 4 - Take a break

![Alt Text](https://thepracticaldev.s3.amazonaws.com/i/rkrryl9nk3j5av21ges9.png)

I know it sounds counterproductive, but it is actually a key component of productivity. If you never take a break, you’ll most likely burn out and your side project will burn with you.

It is also common for entrepreneurs to put their mental health on the back burner. But your most important asset is your mental health. If you don’t feel good, you can’t perform. Focus on your mental health and overall health before anything else. Take care.

---

You can also find these pixels on my Instagram: https://instagram.com/valentinprgnd. I will publish Pixels every Monday, Wednesday, and Friday about career development in tech, code, mental health and health for developers. Follow me for more tips @valentinprngd and check out my podcast https://rebased.whatdafox.com.
Code Pixel - Keep it lean
Published: 2020-01-23 14:30:47

How to keep your code lean and simple to prevent tech debt:

## 1 - Avoid nesting

![Alt Text](https://thepracticaldev.s3.amazonaws.com/i/05sz38ls077g9t5dbol6.png)

Try to avoid nesting your conditionals and loops. They can quickly add up and increase complexity. There are times when you have no choice and nesting could reduce complexity, but in general this Is a good practice.

## 2 - Naming is hard

![Alt Text](https://thepracticaldev.s3.amazonaws.com/i/rj4wofy2l95gqaagxdge.png)

Naming is hard. But take the time upfront to name your variables, methods and classes appropriately, it will pay off in the future.

You will be able to understand your code more easily and most importantly: new team members will be able to navigate your codebase quicker when joining your company.

## 3 - No comments…

![Alt Text](https://thepracticaldev.s3.amazonaws.com/i/mv5f5xj1gu6k87raj83c.png)

…okay maybe a few. Try to use your comments to add more context, or point to extra documentation/resource that can help understand the piece of code below. Avoid redundant comments simply repeating the name of the method, especially is you have proper naming, as it won’t provide more context and make the code bloated.

## 4 - Don’t overthink it

![Alt Text](https://thepracticaldev.s3.amazonaws.com/i/nni88nfv1bne296hsjl2.png)

Good code is most importantly code that works. 

You can always come back to your code later to improve scalability or performance. Keep it lean and simple, it will prevent tech debt and your teammates will thank you.

## BONUS TIPS
 
- reduce your method size. I personally like to keep my method under 25/30 lines long. 
- Extract complex conditionals in methods and name them appropriately: `isUserAuthenticated()`, `isOrderComplete` etc…

---

You can also find these pixels on my Instagram: https://instagram.com/valentinprgnd. I will publish Pixels every Monday, Wednesday, and Friday about career development in tech, code, mental health and health for developers. Follow me for more tips @valentinprngd and check out my podcast https://rebased.whatdafox.com.