{"id":38729,"url":"https://github.com/thuytrinh/dev-bookmarks","name":"dev-bookmarks","description":"Links to blogposts, books, conference talks and so on regarding software development","projects_count":68,"last_synced_at":"2026-09-07T20:00:24.703Z","repository":{"id":150583569,"uuid":"158084774","full_name":"thuytrinh/dev-bookmarks","owner":"thuytrinh","description":"Links to blogposts, books, conference talks and so on regarding software development","archived":false,"fork":false,"pushed_at":"2019-04-23T22:07:54.000Z","size":61,"stargazers_count":5,"open_issues_count":0,"forks_count":0,"subscribers_count":3,"default_branch":"master","last_synced_at":"2026-08-19T03:07:49.393Z","etag":null,"topics":["android","blogposts","books","conference-talk","links","lists","software-development","unit-testing"],"latest_commit_sha":null,"homepage":"","language":null,"has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/thuytrinh.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null}},"created_at":"2018-11-18T13:07:39.000Z","updated_at":"2024-02-04T08:35:41.000Z","dependencies_parsed_at":"2023-06-11T07:45:15.650Z","dependency_job_id":null,"html_url":"https://github.com/thuytrinh/dev-bookmarks","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/thuytrinh/dev-bookmarks","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/thuytrinh%2Fdev-bookmarks","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/thuytrinh%2Fdev-bookmarks/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/thuytrinh%2Fdev-bookmarks/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/thuytrinh%2Fdev-bookmarks/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/thuytrinh","download_url":"https://codeload.github.com/thuytrinh/dev-bookmarks/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/thuytrinh%2Fdev-bookmarks/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":341189360,"owners_count":37137549,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-08-22T15:14:58.755Z","status":"online","status_checked_at":"2026-09-07T02:00:07.396Z","response_time":63,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"created_at":"2024-01-13T13:59:57.280Z","updated_at":"2026-09-07T20:00:24.704Z","primary_language":null,"list_of_lists":false,"displayable":true,"categories":["Functional programming","Reactive programming","Misc","Technical leadership","Project modularization","Android development","Kotlin Multiplatform","Flutter","Automation tests","Git","Inheritance","DevOps"],"sub_categories":[],"readme":"# Bookmarks\n\n## Technical leadership\n\n- http://codeplease.io/2018/01/15/on-being-an-engineering-manager/.\n- [Effective Engineer - Notes](https://gist.github.com/rondy/af1dee1d28c02e9a225ae55da2674a6f)\n- [What are the steps to become a lead developer?](https://www.quora.com/What-are-the-steps-to-become-a-lead-developer)\n- [Scaling Engineering Teams via Writing Things Down and Sharing - aka RFCs](https://blog.pragmaticengineer.com/scaling-engineering-teams-via-writing-things-down-rfcs/)\n- [How to Debate Ideas Productively at Work](https://hbr.org/2019/01/how-to-debate-ideas-productively-at-work)\n- [Don’t lead by example](https://blogs.dropbox.com/tech/2019/02/dont-lead-by-example/)\n- [Embracing Papercuts](https://medium.com/@jamesacowling/embracing-papercuts-e6390055dfc4)\n- [The Senior Engineer’s Guide to Helping Others Make Decisions](https://silverwraith.com/blog/2017/10/the-senior-engineers-guide-to-helping-others-make-decisions/)\n- [Ideas for a healthier engineering environment](https://alsutton.blog/post/healthy-engineering/)\n\n## Android development\n\n- [Polymorphic Deserialization with Moshi](http://blog.nightlynexus.com/polymorphic-deserialization-with-moshi/)\n- [Lessons learned implementing Redux on Android](https://blog.pusher.com/lessons-learned-implementing-redux-on-android)\n- [Unidirectional Data Flow in Kotlin](https://github.com/ReKotlin/ReKotlin)\n- [Unidirectional data flow on Android using Kotlin: The blog post (part 1)](https://proandroiddev.com/unidirectional-data-flow-on-android-the-blog-post-part-1-cadcf88c72f5)\n- [Kotlin coding style @ Ubie, Inc](https://github.com/ubie-inc/kotlin-coding-style)\n- [Keeping check on your Android Libraries with Danger \u0026 Bitrise](https://overflow.buffer.com/2018/10/26/keeping-check-on-your-android-libraries-with-danger-bitrise/)\n- [Use ContentObserver in Your Code to Listen to Data Changes](https://www.grokkingandroid.com/use-contentobserver-to-listen-to-changes/)\n- [How to maximize Android’s UI reusability — 5 common mistakes](https://proandroiddev.com/how-to-maximize-androids-ui-reusability-5-common-mistakes-cb2571216a9f)\n- [How To do Video Streaming on Android Offline Using WiDi](https://coteries.com/2018/04/10/video-streaming-android-offline-widi/)\n- [Consistency is Key - Working with a design system](https://speakerdeck.com/marianeum/consistency-is-key-working-with-a-design-system)\n\n## Kotlin Multiplatform\n\n- [MVP in Kotlin Multiplatform](https://medium.com/@liewjuntung/mvp-in-kotlin-multiplatform-4b828f18ed63)\n\n## Flutter\n\n- [Flutter State Management Guide](https://fireship.io/lessons/flutter-state-management-guide/)\n\n## Automation tests\n\n- [A view on testing Android apps](https://proandroiddev.com/writing-integration-tests-in-android-b0436978ed7b)\n- [Do Androids Dream of UI Testing?](https://arturdryomov.online/posts/do-androids-dream-of-ui-testing/)\n- [When to Mock](http://blog.cleancoder.com/uncle-bob/2014/05/10/WhenToMock.html)\n- [Mock Objects: Shortcomings and Use Cases](https://www.oracle.com/technetwork/articles/entarch/mock-shortcomings-082129.html)\n- [How to write good tests](https://github.com/mockito/mockito/wiki/How-to-write-good-tests)\n- [Writing Better Tests With JUnit](https://blog.codecentric.de/en/2016/01/writing-better-tests-junit/)\n- [Three Reasons Why We Should Not Use Inheritance In Our Tests](https://www.petrikainulainen.net/programming/unit-testing/3-reasons-why-we-should-not-use-inheritance-in-our-tests/)\n- [Write awesome unit tests](https://speakerdeck.com/jeroenmols/write-awesome-unit-tests) ([Video](https://youtu.be/F8Gc8Nwf0yk))\n- [Don’t be lazy, use @Rules](https://medium.com/@cortinico/dont-be-lazy-use-rules-95c68f4ecb8b)\n- [Unit testing best practices with .NET Core and .NET Standard](https://docs.microsoft.com/en-us/dotnet/core/testing/unit-testing-best-practices)\n- [Toehold Test](https://publicobject.com/2019/02/17/toehold-test/)\n- [Test Doubles — Fakes, Mocks and Stubs.](https://blog.pragmatists.com/test-doubles-fakes-mocks-and-stubs-1a7491dfa3da)\n- [But Testing Sucks!](https://jlengstorf.github.io/presentations/building-quality-driven-culture/#/)\n- [Why Good Developers Write Bad Tests](https://youtu.be/hM_ex4-xu4E)\n\n## Project modularization\n\n- [How Yelp Modularized the Android App](https://engineeringblog.yelp.com/2018/06/how-yelp-modularized-the-android-app.html).\n- [Package by feature, not layer](http://www.javapractices.com/topic/TopicAction.do?Id=205)\n\n## Git\n\n- [Get the latest tag in a git](https://gist.github.com/rponte/fdc0724dd984088606b0)\n- [nodegit examples](https://github.com/nodegit/nodegit/tree/master/examples)\n- [Create a pull request by octokit](https://octokit.github.io/rest.js/#api-Pulls-create)\n\n## Reactive programming\n\n- [React 2014 : Erik Meijer - What does it mean to be Reactive?](https://www.youtube.com/watch?v=sTSQlYX5DU0)\n- [RX GLITCHES AREN'T ACTUALLY A PROBLEM](https://staltz.com/rx-glitches-arent-actually-a-problem.html)\n- [Applying Rx Best Practices to Your Architecture](https://www.youtube.com/watch?v=n1viQvZVslE)\n- [No Cause for Concern — RxJava and Retrofit Throwing a Tantrum](https://medium.com/square-corner-blog/no-cause-for-concern-rxjava-and-retrofit-throwing-a-tantrum-96c9e4ba8a6c)\n\n## Functional programming\n\n- [Functional Program Design in Scala](https://www.coursera.org/learn/progfun2)\n- [Functional Programming in Kotlin with Arrow](https://www.47deg.com/media/2018/10/15/raul-raja-kotlinconf-2018/)\n- [Functional architecture: a definition](http://blog.ploeh.dk/2018/11/19/functional-architecture-a-definition/)\n- [Arrow for Kotlin Presentations](https://www.youtube.com/playlist?list=PLTx-VKTe8yLwNy3oXbbwsQRwoS-G8mhEh)\n- [The Unreasonable Effectiveness of Metaphor](https://argumatronic.com/posts/2018-09-02-effective-metaphor.html)\n- [Functional Programming in Scala](https://www.manning.com/books/functional-programming-in-scala)\n- [Tuple bifunctor](http://blog.ploeh.dk/2018/12/31/tuple-bifunctor/)\n\n## Inheritance\n\n- [Inheritance is evil. Stop using it.](https://codeburst.io/inheritance-is-evil-stop-using-it-6c4f1caf5117)\n- [Mixins over Inheritance](http://alisoftware.github.io/swift/protocol/2015/11/08/mixins-over-inheritance/)\n- [IF YOU'RE SUBCLASSING, YOU'RE DOING IT WRONG](https://krakendev.io/blog/subclassing-can-suck-and-heres-why)\n- [Composition vs. Inheritance: How to Choose?](https://www.thoughtworks.com/de/insights/blog/composition-vs-inheritance-how-choose)\n\n## DevOps\n\n- [A shell parser, formatter and interpreter (POSIX/Bash/mksh)](https://github.com/mvdan/sh)\n- [CI/CD Tools Throwdown: Jenkins vs. TeamCity vs. Bamboo](https://stackify.com/jenkins-teamcity-bamboo/)\n\n## Misc\n\n- https://carbon.now.sh/ to tweet with code image.\n- Software architect https://developertoarchitect.com/\n- [Code coverage is a useless target measure](http://blog.ploeh.dk/2015/11/16/code-coverage-is-a-useless-target-measure/)\n- [TASCHEN books](https://www.taschen.com/pages/de/catalogue/all_titles/index.alle_titel.htm?crt_page=1)\n- [All you need is tools](https://ppinera.es/2018/11/25/all-you-need-is-tools.html)\n- [GRADLE INITIALIZR](https://gradle-initializr.cleverapps.io/)\n- [Better Code Reviews](http://www.bettercode.reviews/)\n- http://www.cs.uni.edu/~wallingf/blog/archives/monthly/2019-01.html#e2019-01-08T14_10_04.htm\n- [Define a general guidance for tech projects quality assurance at Karumi](https://github.com/Karumi/project-quality-assurance)\n- [Feature Toggles (aka Feature Flags)](https://martinfowler.com/articles/feature-toggles.html)\n- [Awesome Developer Streams](https://github.com/bnb/awesome-developer-streams)\n- [What does it mean when code is “easy to reason about”?](https://medium.freecodecamp.org/what-does-it-mean-when-code-is-easy-to-reason-about-4e6f63eb386f)\n- [The Wrong Abstraction](https://www.sandimetz.com/blog/2016/1/20/the-wrong-abstraction)\n- [Working with a Counterpart](https://overcast.fm/+QswaI7Rko)\n- [Slack Is Not Where 'Deep Work' Happens](https://blog.nuclino.com/slack-is-not-where-deep-work-happens)\n","projects_url":"https://awesome.ecosyste.ms/api/v1/lists/thuytrinh%2Fdev-bookmarks/projects"}