├── LICENSE └── README.md /LICENSE: -------------------------------------------------------------------------------- 1 | Apache License 2 | Version 2.0, January 2004 3 | http://www.apache.org/licenses/ 4 | 5 | TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 6 | 7 | 1. Definitions. 8 | 9 | "License" shall mean the terms and conditions for use, reproduction, 10 | and distribution as defined by Sections 1 through 9 of this document. 11 | 12 | "Licensor" shall mean the copyright owner or entity authorized by 13 | the copyright owner that is granting the License. 14 | 15 | "Legal Entity" shall mean the union of the acting entity and all 16 | other entities that control, are controlled by, or are under common 17 | control with that entity. For the purposes of this definition, 18 | "control" means (i) the power, direct or indirect, to cause the 19 | direction or management of such entity, whether by contract or 20 | otherwise, or (ii) ownership of fifty percent (50%) or more of the 21 | outstanding shares, or (iii) beneficial ownership of such entity. 22 | 23 | "You" (or "Your") shall mean an individual or Legal Entity 24 | exercising permissions granted by this License. 25 | 26 | "Source" form shall mean the preferred form for making modifications, 27 | including but not limited to software source code, documentation 28 | source, and configuration files. 29 | 30 | "Object" form shall mean any form resulting from mechanical 31 | transformation or translation of a Source form, including but 32 | not limited to compiled object code, generated documentation, 33 | and conversions to other media types. 34 | 35 | "Work" shall mean the work of authorship, whether in Source or 36 | Object form, made available under the License, as indicated by a 37 | copyright notice that is included in or attached to the work 38 | (an example is provided in the Appendix below). 39 | 40 | "Derivative Works" shall mean any work, whether in Source or Object 41 | form, that is based on (or derived from) the Work and for which the 42 | editorial revisions, annotations, elaborations, or other modifications 43 | represent, as a whole, an original work of authorship. For the purposes 44 | of this License, Derivative Works shall not include works that remain 45 | separable from, or merely link (or bind by name) to the interfaces of, 46 | the Work and Derivative Works thereof. 47 | 48 | "Contribution" shall mean any work of authorship, including 49 | the original version of the Work and any modifications or additions 50 | to that Work or Derivative Works thereof, that is intentionally 51 | submitted to Licensor for inclusion in the Work by the copyright owner 52 | or by an individual or Legal Entity authorized to submit on behalf of 53 | the copyright owner. For the purposes of this definition, "submitted" 54 | means any form of electronic, verbal, or written communication sent 55 | to the Licensor or its representatives, including but not limited to 56 | communication on electronic mailing lists, source code control systems, 57 | and issue tracking systems that are managed by, or on behalf of, the 58 | Licensor for the purpose of discussing and improving the Work, but 59 | excluding communication that is conspicuously marked or otherwise 60 | designated in writing by the copyright owner as "Not a Contribution." 61 | 62 | "Contributor" shall mean Licensor and any individual or Legal Entity 63 | on behalf of whom a Contribution has been received by Licensor and 64 | subsequently incorporated within the Work. 65 | 66 | 2. Grant of Copyright License. Subject to the terms and conditions of 67 | this License, each Contributor hereby grants to You a perpetual, 68 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 69 | copyright license to reproduce, prepare Derivative Works of, 70 | publicly display, publicly perform, sublicense, and distribute the 71 | Work and such Derivative Works in Source or Object form. 72 | 73 | 3. Grant of Patent License. Subject to the terms and conditions of 74 | this License, each Contributor hereby grants to You a perpetual, 75 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 76 | (except as stated in this section) patent license to make, have made, 77 | use, offer to sell, sell, import, and otherwise transfer the Work, 78 | where such license applies only to those patent claims licensable 79 | by such Contributor that are necessarily infringed by their 80 | Contribution(s) alone or by combination of their Contribution(s) 81 | with the Work to which such Contribution(s) was submitted. If You 82 | institute patent litigation against any entity (including a 83 | cross-claim or counterclaim in a lawsuit) alleging that the Work 84 | or a Contribution incorporated within the Work constitutes direct 85 | or contributory patent infringement, then any patent licenses 86 | granted to You under this License for that Work shall terminate 87 | as of the date such litigation is filed. 88 | 89 | 4. Redistribution. You may reproduce and distribute copies of the 90 | Work or Derivative Works thereof in any medium, with or without 91 | modifications, and in Source or Object form, provided that You 92 | meet the following conditions: 93 | 94 | (a) You must give any other recipients of the Work or 95 | Derivative Works a copy of this License; and 96 | 97 | (b) You must cause any modified files to carry prominent notices 98 | stating that You changed the files; and 99 | 100 | (c) You must retain, in the Source form of any Derivative Works 101 | that You distribute, all copyright, patent, trademark, and 102 | attribution notices from the Source form of the Work, 103 | excluding those notices that do not pertain to any part of 104 | the Derivative Works; and 105 | 106 | (d) If the Work includes a "NOTICE" text file as part of its 107 | distribution, then any Derivative Works that You distribute must 108 | include a readable copy of the attribution notices contained 109 | within such NOTICE file, excluding those notices that do not 110 | pertain to any part of the Derivative Works, in at least one 111 | of the following places: within a NOTICE text file distributed 112 | as part of the Derivative Works; within the Source form or 113 | documentation, if provided along with the Derivative Works; or, 114 | within a display generated by the Derivative Works, if and 115 | wherever such third-party notices normally appear. The contents 116 | of the NOTICE file are for informational purposes only and 117 | do not modify the License. You may add Your own attribution 118 | notices within Derivative Works that You distribute, alongside 119 | or as an addendum to the NOTICE text from the Work, provided 120 | that such additional attribution notices cannot be construed 121 | as modifying the License. 122 | 123 | You may add Your own copyright statement to Your modifications and 124 | may provide additional or different license terms and conditions 125 | for use, reproduction, or distribution of Your modifications, or 126 | for any such Derivative Works as a whole, provided Your use, 127 | reproduction, and distribution of the Work otherwise complies with 128 | the conditions stated in this License. 129 | 130 | 5. Submission of Contributions. Unless You explicitly state otherwise, 131 | any Contribution intentionally submitted for inclusion in the Work 132 | by You to the Licensor shall be under the terms and conditions of 133 | this License, without any additional terms or conditions. 134 | Notwithstanding the above, nothing herein shall supersede or modify 135 | the terms of any separate license agreement you may have executed 136 | with Licensor regarding such Contributions. 137 | 138 | 6. Trademarks. This License does not grant permission to use the trade 139 | names, trademarks, service marks, or product names of the Licensor, 140 | except as required for reasonable and customary use in describing the 141 | origin of the Work and reproducing the content of the NOTICE file. 142 | 143 | 7. Disclaimer of Warranty. Unless required by applicable law or 144 | agreed to in writing, Licensor provides the Work (and each 145 | Contributor provides its Contributions) on an "AS IS" BASIS, 146 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or 147 | implied, including, without limitation, any warranties or conditions 148 | of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A 149 | PARTICULAR PURPOSE. You are solely responsible for determining the 150 | appropriateness of using or redistributing the Work and assume any 151 | risks associated with Your exercise of permissions under this License. 152 | 153 | 8. Limitation of Liability. In no event and under no legal theory, 154 | whether in tort (including negligence), contract, or otherwise, 155 | unless required by applicable law (such as deliberate and grossly 156 | negligent acts) or agreed to in writing, shall any Contributor be 157 | liable to You for damages, including any direct, indirect, special, 158 | incidental, or consequential damages of any character arising as a 159 | result of this License or out of the use or inability to use the 160 | Work (including but not limited to damages for loss of goodwill, 161 | work stoppage, computer failure or malfunction, or any and all 162 | other commercial damages or losses), even if such Contributor 163 | has been advised of the possibility of such damages. 164 | 165 | 9. Accepting Warranty or Additional Liability. While redistributing 166 | the Work or Derivative Works thereof, You may choose to offer, 167 | and charge a fee for, acceptance of support, warranty, indemnity, 168 | or other liability obligations and/or rights consistent with this 169 | License. However, in accepting such obligations, You may act only 170 | on Your own behalf and on Your sole responsibility, not on behalf 171 | of any other Contributor, and only if You agree to indemnify, 172 | defend, and hold each Contributor harmless for any liability 173 | incurred by, or claims asserted against, such Contributor by reason 174 | of your accepting any such warranty or additional liability. 175 | 176 | END OF TERMS AND CONDITIONS 177 | 178 | APPENDIX: How to apply the Apache License to your work. 179 | 180 | To apply the Apache License to your work, attach the following 181 | boilerplate notice, with the fields enclosed by brackets "{}" 182 | replaced with your own identifying information. (Don't include 183 | the brackets!) The text should be enclosed in the appropriate 184 | comment syntax for the file format. We also recommend that a 185 | file or class name and description of purpose be included on the 186 | same "printed page" as the copyright notice for easier 187 | identification within third-party archives. 188 | 189 | Copyright {yyyy} {name of copyright owner} 190 | 191 | Licensed under the Apache License, Version 2.0 (the "License"); 192 | you may not use this file except in compliance with the License. 193 | You may obtain a copy of the License at 194 | 195 | http://www.apache.org/licenses/LICENSE-2.0 196 | 197 | Unless required by applicable law or agreed to in writing, software 198 | distributed under the License is distributed on an "AS IS" BASIS, 199 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 200 | See the License for the specific language governing permissions and 201 | limitations under the License. 202 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Android-links 2 | ![](https://img.shields.io/badge/Updated-April%20%2026%202025-brightgreen.svg) 3 | 4 | Manually curated collection of links about android development, developer work and life, that I found useful/interesting. 5 | 6 | Jump to 7 | - [Android](#android) 8 | - [Views](#views) 9 | - [Main](#main) 10 | - [`RecyclerView`](#RecyclerView) 11 | - [Dialogs](#dialogs) 12 | - [`WebView`](#webview) 13 | - [`Compose`](#compose) 14 | - [Context](#context) 15 | - [Fragment](#fragment) 16 | - [Service](#service) 17 | - [Themes](#themes) 18 | - [Gradle](#gradle) 19 | - [Architecture](#architecture) 20 | - [IDE](#ide) 21 | - [Other](#other) 22 | - [Programming language](#programming-language) 23 | - [Kotlin](#kotlin) 24 | - [Java](#java) 25 | - [Software development](#software-development) 26 | - [OOP](#oop) 27 | - [Design patterns](#patterns) 28 | - [Tests](#tests) 29 | - [Git](#git) 30 | - [Developer Work](#work) 31 | - [Developer Life](#life) 32 | - [Libraries](#libraries) 33 | - [Rx](#rx) 34 | - [DI](#di) 35 | - [Other Libraries](#other-libraries) 36 | 37 | # Android 38 | 39 | ## Views 40 | [back to top](#readme) 41 | ### Main 42 | * [Animating Android Activities and Views with Left and Right Slide Animations](https://kylewbanks.com/blog/left-and-right-slide-animations-on-android-activity-or-view) 43 | * [Drawing multiline text to Canvas](https://medium.com/over-engineering/drawing-multiline-text-to-canvas-on-android-9b98f0bfa16a) 44 | * [Spantastic text styling with Spans](https://medium.com/google-developers/spantastic-text-styling-with-spans-17b0c16b4568) 45 | * [Customizing Switch using XML](https://medium.com/@elye.project/customizing-switch-using-xml-ca0d37204a86) 46 | * [[Youtube] View only Android apps at scale](https://www.youtube.com/watch?v=kAAnIN-IqWw) 47 | * [Rich text battle: TextView vs WebView](http://www.hidroh.com/2016/02/27/richtext-textview-versus-webview/) 48 | * [A guide for Android ImageView ScaleType and adjustViewBounds](https://proandroiddev.com/a-guide-for-android-imageview-scaletype-and-adjustviewbounds-64a1e4a35503) 49 | * [ViewPager without fragments](https://www.bignerdranch.com/blog/viewpager-without-fragments/) 50 | * [Introduction to SpringAnimation with examples](https://www.thedroidsonroids.com/blog/android/springanimation-examples/) 51 | * [-nodpi, -anydpi, and WTF?](https://commonsware.com/blog/2015/12/21/nodpi-anydpi-wtf.html) 52 | * [TransitionDrawable — Small Gems of the Android Framework](https://proandroiddev.com/transitiondrawable-small-gems-of-the-android-framework-4dcdd3c83319) 53 | * [Preferred way to set clickable image icon](https://medium.com/@elye.project/preferred-way-to-set-clickable-image-icon-95b0c88f3cd9) 54 | * [Selectively Locking An Android UI](https://mpope9.github.io/2018/09/06/LockingAndroidUI.html) 55 | * [[Yotube] Loving Lean Layouts](https://www.youtube.com/watch?v=-xAdDqwaWJk) 56 | * [How to maximize Android’s UI reusability — 5 common mistakes](https://proandroiddev.com/how-to-maximize-androids-ui-reusability-5-common-mistakes-cb2571216a9f) 57 | * [State of the Navigation Drawer](https://androiduipatterns.com/state-of-the-navigation-drawer-1d2c8253de2a) 58 | * [On the Bottom Navigation Bar](https://androiduipatterns.com/on-the-bottom-navigation-bar-d07d9b4b5e18) 59 | * [You thought you knew Android](https://medium.com/@anoopss/you-thought-you-knew-android-e46a556d0773) 60 | * [Parallax Scrolling](https://blog.stylingandroid.com/parallax-scrolling/) 61 | * [Resolving View Attributes on Android](https://ataulm.github.io/2019/10/28/resolving-view-attributes.html) 62 | * [ConstraintLayout Flow: Simple Grid Building Without Nested Layouts](https://www.bignerdranch.com/blog/constraintlayout-flow-simple-grid-building-without-nested-layouts/) 63 | * [ConstraintLayout: Circular Positioning](https://medium.com/devnibbles/constraintlayout-circular-positioning-9489b11cb0e5) 64 | * [How to Support Themes in Custom Views](https://infinum.com/the-capsized-eight/how-to-support-themes-in-custom-views-for-android-apps) 65 | * [Animating a strike through on Android](https://tigeroakes.com/posts/android-animate-strike-thru/) 66 | * [AnimatedIcons: Strikethru](https://blog.stylingandroid.com/animatedicons-strikethru/) 67 | * [Adventures in the Land of EditText](https://markushintersteiner.at/blog/adventures_in_the_land_of_edittext/) 68 | * [ViewStub: On-demand inflate view or lazily inflate layout resource](https://proandroiddev.com/viewstub-on-demand-inflate-view-or-inflate-lazily-layout-resource-e56b8c39398b) 69 | * [The Lifecycle of a View in Android](https://proandroiddev.com/the-life-cycle-of-a-view-in-android-6a2c4665b95e) 70 | * [Android’s ImageView scale type cheatsheet](https://uxdesign.cc/androids-imageview-scale-type-cheatsheet-1528cbad8db4) 71 | * [NumberPicker](https://blog.stylingandroid.com/numberpicker/) 72 | * [MotionLayout: Visibility](https://blog.stylingandroid.com/motionlayout-visibility/) 73 | * [2 Android components you should start using right now!](https://medium.com/@sonique6784/2-android-components-you-should-start-using-right-now-b68515fcf9e8) 74 | * [Material Slider](https://blog.stylingandroid.com/material-slider/) 75 | * [MaterialTimePicker](https://blog.stylingandroid.com/materialtimepicker/) 76 | * [Controlling TextView MinWidth](https://krossovochkin.com/posts/2021_09_14_controlling_textview_minwidth/) 77 | * [[Youtube] Transitions without Activities or Fragments](https://www.youtube.com/watch?v=9Y5cbC5YrOY) 78 | * [Building a Segmented Progress Bar in Android](https://medium.com/betclic-tech/building-a-segmented-progress-bar-in-android-e3f198db393d) 79 | * [Sonar-like animation](https://proandroiddev.com/sonar-like-animation-c1e7c5b291bd) 80 | * [Translucent SystemBars the right way — across API levels and themes](https://medium.com/androiddevelopers/translucent-systembars-the-right-way-across-api-levels-and-themes-6d7ddda21396) 81 | ### RecyclerView 82 | * [Implementing a modal selection helper for RecyclerView](https://medium.com/@BladeCoder/implementing-a-modal-selection-helper-for-recyclerview-1e888b4cd5b9) 83 | * [RecyclerView animations done right](http://frogermcs.github.io/instamaterial-recyclerview-animations-done-right/) 84 | * [Your ViewHolders Could Be Doing So Much More](https://jonfhancock.com/your-viewholders-are-dumb-make-em-not-dumb-82e6f73f630c) 85 | * [ItemDecoration in Android](https://medium.com/proandroiddev/itemdecoration-in-android-e18a0692d848) 86 | * [[Yotube] Mastering RecyclerView Layouts](https://www.youtube.com/watch?v=gs_C1E8HwvE) 87 | * [RecyclerView — More Animations with Less Code using Support Library ListAdapter](https://medium.com/@trionkidnapper/recyclerview-more-animations-with-less-code-using-support-library-listadapter-62e65126acdb) 88 | * [Right way of setting margin on Recycler View’s cell](https://medium.com/@elye.project/right-way-of-setting-margin-on-recycler-views-cell-319da259b641) 89 | * [DiffUtil is a must](https://proandroiddev.com/diffutil-is-a-must-797502bc1149) 90 | * [RecyclerView Anti-Patterns](https://proandroiddev.com/recyclerview-antipatterns-8af3feeeccc7) 91 | * [Nested recycler in Android done right!](https://medium.com/nerd-for-tech/nested-recycler-in-android-done-right-b101744e2a9a) 92 | * [Efficient lists with DiffUtil and ListAdapter](https://bignerdranch.com/blog/efficient-lists-with-diffutil-and-listadapter/) 93 | * [RecyclerView Item Change Animations With a Custom Item Animator](https://medium.com/swlh/recyclerview-item-change-animations-ebe2383bb481) 94 | * [Paging Image Carousel with RecyclerView](https://medium.com/holler-developers/paging-image-gallery-with-recyclerview-f059d035b7e7) 95 | ### Dialogs 96 | * [Exploring Android P: Fingerprint Dialog](https://medium.com/exploring-android/exploring-android-p-fingerprint-dialog-fa672ae62c6f) 97 | * [Dialogs in Android: Practical Guide](https://www.techyourchance.com/dialogs-in-android-practical-guide/) 98 | * [What you might not know about the AlertDialog](https://proandroiddev.com/what-you-might-not-know-about-the-alertdialog-2bdc55f3d907) 99 | * [Mastering Android Dialogs: Don’t follow official Google Guides](https://medium.com/codex/mastering-android-dialogs-dont-follow-official-google-guides-3821f8e9dd91) 100 | ### WebView 101 | * [Android WebView — Downloading Images](https://medium.com/@trionkidnapper/android-webview-downloading-images-f0ec21ac75d2) 102 | * [Android WebViews: All about security](https://proandroiddev.com/android-webviews-1cbe1ffb7a2b) 103 | * [Managing Keyboard on Webview](https://medium.com/@elye.project/managing-keyboard-on-webview-d2e89109d106) 104 | * [Clean Android WebView caching](https://medium.com/microsoft-mobile-engineering/clean-android-webview-caching-9b871b3579f3) 105 | ### Compose 106 | * [Thinking in Compose](https://developer.android.com/jetpack/compose/mental-model) 107 | * [[Youtube] Jetpack Compose: Beta overview](https://www.youtube.com/watch?v=Ef1xKWjA9E8) 108 | * [Jetpack Compose: Modifiers fundamentals](https://www.rockandnull.com/jetpack-compose-modifier/) 109 | * [Always provide a Modifier parameter](https://chris.banes.dev/always-provide-a-modifier/) 110 | * [How to create a truly custom theme in Jetpack Compose](https://proandroiddev.com/how-to-create-a-truly-custom-theme-in-jetpack-compose-55fb4cd6d655) 111 | * [A Vocabulary of Jetpack Compose Terms](https://www.pamelaahill.com/post/a-vocabulary-of-jetpack-compose-terms) 112 | * [Loading images for Jetpack Compose using Glide, Coil, and Fresco](https://proandroiddev.com/loading-images-for-jetpack-compose-using-glide-coil-and-fresco-1211261a296e) 113 | * [Remembering the State in Jetpack Compose](https://patxi.medium.com/remembering-the-state-in-jetpack-compose-e97928ecff68) 114 | * [Compose O'Clock](https://zsmb.co/compose-o-clock/) 115 | * [Jetpack Compose — Reveal effect](https://dev.to/bmonjoie/jetpack-compose-reveal-effect-1fao) 116 | * [Instagram-like particles animation using Jetpack Compose](https://andreytzkt.medium.com/instagram-like-particles-animation-using-jetpack-compose-9cef387884a2) 117 | * [Building design system with Jetpack Compose](https://proandroiddev.com/building-design-system-with-jetpack-compose-1208c250ae75) 118 | * [State and Jetpack Compose](https://developer.android.com/jetpack/compose/state) 119 | * [Jetpack Compose: styling Text](https://alexzh.com/jetpack-compose-styling-text/) 120 | * [Jetpack Compose with Lifecycle-Aware Composables](https://betterprogramming.pub/jetpack-compose-with-lifecycle-aware-composables-7bd5d6793e0) 121 | * [From View to Composable: A Quick jump to Jetpack Compose from an Android View mindset](https://medium.com/@alexstyl/views-to-composables-d715b92c6055) 122 | * [Building an Authentication Form using Jetpack Compose](https://joebirch.co/android/building-an-authentication-form-using-jetpack-compose/) 123 | * [Promise compose compiler and imply when you'll change](https://blog.shreyaspatil.dev/promise-compose-compiler-and-imply-when-youll-change) 124 | * [Keyboard Handling In Jetpack Compose — All You Need To Know](https://blog.canopas.com/keyboard-handling-in-jetpack-compose-all-you-need-to-know-3e6fddd30d9a) 125 | * [How can I debug recompositions in Jetpack Compose?](https://www.jetpackcompose.app/articles/how-can-I-debug-recompositions-in-jetpack-compose) 126 | * [Composable functions and return types](https://www.valueof.io/blog/compose-composable-return-types) 127 | * [Compose remember vs remember mutableStateOf](https://www.valueof.io/blog/jetpack-compose-remember-vs-mutablestateof) 128 | * [Diving Into Compose — Lessons Learned While Building Maps Compose](https://medium.com/androiddevelopers/diving-into-compose-lessons-learned-while-building-maps-compose-d20ef5dfe1bb) 129 | * [Jetpack Compose Effect Handlers](https://jorgecastillo.dev/jetpack-compose-effect-handlers) 130 | * [Here's a productivity hack to save tens of engineering hours* when working with Jetpack Compose!](https://www.jetpackcompose.app/articles/productivity-hack-to-save-tens-of-engineering-hours-when-working-with-Jetpack-Compose) 131 | * [Lazy Grid layouts in Compose](https://www.valueof.io/blog/lazy-grids-gridcells-fixed-adaptive-custom-compose) 132 | * [Quick Note on Jetpack Compose Recomposition](https://blog.canopas.com/quick-note-on-jetpack-compose-recomposition-d9af4e3f8e5b) 133 | * [Debugging and fixing a *huge* Jetpack Compose performance problem in my Sudoku-solver app](https://christopherward.medium.com/debugging-and-fixing-a-huge-jetpack-compose-performance-problem-in-my-sudoku-solver-app-8f67fa229dc2) 134 | * [Jetpack Compose — When should I use derivedStateOf?](https://medium.com/androiddevelopers/jetpack-compose-when-should-i-use-derivedstateof-63ce7954c11b) 135 | * [Jetpack Compose bottom sheet over Android view using Kotlin extension](https://proandroiddev.com/jetpack-compose-bottom-sheet-over-android-view-using-kotlin-extension-7fecfa8fe369) 136 | * [Animating visibility vs alpha in Compose](https://www.valueof.io/blog/animatedvisibility-animate-float-as-state-alpha-position) 137 | * [Brushing up on Compose Text coloring](https://medium.com/androiddevelopers/brushing-up-on-compose-text-coloring-84d7d70dd8fa) 138 | * [Drawing custom text spans in Compose UI](https://saket.me/compose-custom-text-spans/) 139 | * [Organizing @Composables](https://handstandsam.com/2022/11/30/organizing-composables/) 140 | * [6 Jetpack Compose Guidelines to Optimize Your App Performance](https://getstream.io/blog/jetpack-compose-guidelines/) 141 | * [Comparing Jetpack Compose performance with XML](https://medium.com/okcredit/comparing-jetpack-compose-performance-with-xml-9462a1282c6b) 142 | * [Nested Auto Scroll For Section Based Lists With Jetpack Compose](https://proandroiddev.com/nested-auto-scroll-for-multiple-section-based-lists-with-jetpack-compose-c193a9814b09) 143 | * [Exploring Jetpack Compose for Android TV: Carousel](https://joebirch.co/android/exploring-jetpack-compose-for-android-tv-carousel/) 144 | * [Collapsing Toolbar in Jetpack Compose LazyColumn — Three Approaches](https://proandroiddev.com/collapsing-toolbar-in-jetpack-compose-lazycolumn-3-approaches-702684d61843) 145 | * [How to have multiple styles within Jetpack Compose Text](https://medium.com/@mark.frelih_9464/how-to-have-multiple-styles-within-jetpack-compose-text-2b6d2c3174d8) 146 | * [How to Handle Automatic Content Resizing when keyboard is visible in Jetpack Compose](https://medium.com/@mark.frelih_9464/how-to-handle-automatic-content-resizing-when-keyboard-is-visible-in-jetpack-compose-1c76e0e17c57) 147 | * [Jetpack Compose Tutorial: Replicating Dribbble Audio App - Screen Transitions](https://exyte.com/blog/android-dribbble-replicating-part-4) 148 | * [Jetpack Compose: Switch](https://alexzh.com/jetpack-compose-switch/) 149 | * [Adding animations to Google Maps in Jetpack Compose](https://www.composables.co/tutorials/animate-maps-compose) 150 | * [How to build a time picker with Jetpack Compose](https://victorbrandalise.com/how-to-build-a-time-picker-with-jetpack-compose/) 151 | * [Create a custom Theme with Jetpack Compose](https://lunabee-studio-dev.medium.com/create-a-custom-theme-with-jetpack-compose-3720fc18e01) 152 | * [Consuming flows safely in Jetpack Compose](https://medium.com/androiddevelopers/consuming-flows-safely-in-jetpack-compose-cde014d0d5a3) 153 | * [Customizing Compose Pager with fun indicators and transitions](https://medium.com/androiddevelopers/customizing-compose-pager-with-fun-indicators-and-transitions-12b3b69af2cc) 154 | * [Setting up ViewPager in Jetpack Compose](https://www.sinasamaki.com/setting-up-viewpager-in-jetpack-compose/) 155 | * [Implementing a circular carousel in Jetpack Compose](https://www.francescvilarino.com/jetpack-compose-carousel) 156 | * [Creating Pager Animations in Jetpack Compose](https://www.sinasamaki.com/pager-animations/) 157 | * [Every single type of Dialog in Jetpack Compose and how to use them](https://www.composables.com/tutorials/dialogs) 158 | * [ViewCompositionStrategy Demystified](https://medium.com/androiddevelopers/viewcompositionstrategy-demystefied-276427152f34) 159 | * [Spring & Fling Animations with Jetpack compose](https://blog.canopas.com/android-spring-fling-animation-in-jetpack-compose-64b2a2e54c88) 160 | * [Using PreviewParameters and providing Composables to Jetpack Compose Previews](https://www.droidcon.com/2023/05/17/using-previewparameters-and-providing-composables-to-jetpack-compose-previews/) 161 | * [Deep-dive into derivedStateOf and comparison with remember(key)](https://proandroiddev.com/deep-dive-into-derivedstateof-and-comparison-with-remember-key-d8469602676) 162 | * [Custom TabRow Indicator in Jetpack Compose](https://www.sinasamaki.com/custom-tabrow-indicator-in-jetpack-compose/) 163 | * [Text Scrolling in Jetpack Compose](https://abhimanyu14.medium.com/text-scrolling-in-jetpack-compose-deabc7f67156) 164 | * [Designing Jetpack Compose architecture for a gradual transition from fragments](https://medium.com/turo-engineering/designing-jetpack-compose-architecture-for-a-gradual-transition-from-fragments-on-android-b11ee5f19ba8) 165 | * [Understanding re-composition in Jetpack Compose with a case study](https://proandroiddev.com/understanding-re-composition-in-jetpack-compose-with-a-case-study-9e7d96d98095) 166 | * [Touch Feedback Animation like Spotify in Jetpack Compose](https://blog.protein.tech/touch-feedback-animation-like-spotify-in-jetpack-compose-5ab0d31beb28) 167 | * [Encapsulate your @Composable functions](https://chrynan.codes/encapsulate-your-composables/) 168 | * [Problem solving in Compose Text](https://medium.com/androiddevelopers/problem-solving-in-compose-text-d1dd1feafe4a) 169 | * [Jetpack Compose Tricks: Conditionally Applying Modifiers for Dynamic UIs](https://proandroiddev.com/jetpack-compose-tricks-conditionally-applying-modifiers-for-dynamic-uis-e3fe5a119f45) 170 | * [Compose a Compose Button by composing Composable functions](https://proandroiddev.com/compose-a-compose-button-by-composing-composable-functions-9f275772bd23) 171 | * [Solving the mystery of recompositions in Compose's LazyList](https://blog.shreyaspatil.dev/solving-the-mystery-of-recompositions-in-composes-lazylist) 172 | * [Reduce Recomposition for Images/Icons In Jetpack Compose](https://engineering.teknasyon.com/reduce-recomposition-for-images-icons-in-jetpack-compose-8d2dd3bfa933) 173 | * [Jetpack Compose Side Effects in Details](https://medium.com/@mortitech/exploring-side-effects-in-compose-f2e8a8da946b) 174 | * [Better Previews in Jetpack Compose, Tips and Tricks](https://medium.com/@mortitech/better-previews-in-compose-with-custom-annotations-dc49b94ff579) 175 | * [Jetpack Compose with ViewModel and Flow: A Comprehensive Guide](https://medium.com/@android-world/jetpack-compose-with-viewmodel-and-flow-a-comprehensive-guide-ce3b079a44d1) 176 | * [Exploring Lazy Staggered Grids in Jetpack Compose](https://medium.com/google-developer-experts/exploring-lazy-staggered-grids-in-jetpack-compose-5940d5a393be) 177 | * [Jetpack Compose: Passing data implicitly in Composable screens](https://proandroiddev.com/jetpack-compose-passing-data-implicitly-in-ui-tree-73d88b7559c3) 178 | * [Jetpack Compose Popup — Master It!](https://medium.com/mobile-app-development-publication/jetpack-compose-popup-master-it-98accb23da36) 179 | * [Refining Compose API for design systems](https://medium.com/bumble-tech/refining-compose-api-for-design-systems-d652e2c2eac3) 180 | * [Optimizing Jetpack Compose with @Stable: Smart Recomposition Strategies](https://medium.com/@android-world/optimizing-jetpack-compose-with-stable-smart-recomposition-strategies-81147b779a0a) 181 | * [@Composable Modifier vs composed factory in Jetpack Compose](https://engineering.teknasyon.com/composable-modifier-vs-composed-factory-in-jetpack-compose-6cbb675b0e7b) 182 | * [Stop Passing Event/UI-Action Callbacks in Jetpack Compose](https://engineering.teknasyon.com/stop-passing-event-ui-action-callbacks-in-jetpack-compose-a4143621c365) 183 | * [How to handle single-event in Jetpack Compose](https://marco-cattaneo.medium.com/how-to-handle-single-event-in-jetpack-compose-f90b6220e8c8) 184 | * [Nested LazyColumn in Jetpack Compose](https://blog.kotlin-academy.com/nested-lazycolumn-in-jetpack-compose-79cc5d56c603) 185 | * [Using XML Views in Compose](https://dladukedev.com/articles/034_xml_views_in_compose/) 186 | * [Shared Element Transitions in Jetpack Compose](https://fvilarino.medium.com/shared-element-transitions-in-jetpack-compose-8f553078101e) 187 | * [Styling Internationalized Text in Jetpack Compose](https://proandroiddev.com/styling-internationalized-text-in-jetpack-compose-b73cce64ecaf) 188 | * [The Many Approaches to Providing @Preview data in Jetpack Compose](https://dladukedev.com/articles/036_compose_preview_parameter_data/) 189 | * [Need of ViewCompositionStrategy in Jetpack Compose](https://proandroiddev.com/need-of-viewcompositionstrategy-in-jetpack-compose-5251f71b2139) 190 | * [An introduction about Preview](https://www.droidcon.com/2023/03/07/an-introduction-about-preview-in-jetpack-compose/) 191 | * [Shared Element Transition In Jetpack Compose: Provide Enriched User Experiences](https://proandroiddev.com/shared-element-transition-in-jetpack-compose-provide-enriched-user-experiences-163d4e435869) 192 | * [Exploring Jetpack Compose: Aspect Ratio Modifier](https://joebirch.co/android/exploring-jetpack-compose-aspect-ratio-modifier/) 193 | * [Designing Effective UIs For Enhancing Compose Previews](https://getstream.io/blog/effective-compose-preview/) 194 | * [How to Use ContextualFlowRow with custom overflow logic](https://proandroiddev.com/how-to-use-contextualflowrow-with-custom-overflow-logic-7f8c6e6e0194) 195 | * [10 reasons to NOT use Jetpack Compose](https://sonique6784.medium.com/10-reasons-to-not-use-jetpack-compose-719de5d37c9e) 196 | * [Top 5 Extension Functions Every Jetpack Compose Developer Should Have](https://proandroiddev.com/top-5-extension-functions-every-jetpack-compose-developer-should-have-cbf2c50d557c) 197 | * [5 Tips for Better Compose Previews](https://medium.com/@domen.lanisnik/5-tips-for-better-compose-previews-0fd51c9aa048) 198 | * [Composition Locals in Jetpack Compose: A Beginner-to-Advanced Guide](https://proandroiddev.com/composition-locals-in-jetpack-compose-a-beginner-to-advanced-guide-e6a812ca7620) 199 | * [Fragments & Compose interoperability — Android](https://proandroiddev.com/fragments-compose-interoperability-android-a9a8efee0040) 200 | * [Add powerful analytics modifiers in Jetpack Compose with ModifierLocal!](https://proandroiddev.com/add-powerful-analytics-modifiers-in-jetpack-compose-with-modifierlocal-399e3f8b7914) 201 | * [5 Jetpack Compose Tricks That Saved Me Hours in Real Projects](https://levelup.gitconnected.com/5-jetpack-compose-tricks-that-saved-me-hours-in-real-projects-32d43606e5f0) 202 | 203 | --- 204 | 205 | ## Context 206 | [back to top](#readme) 207 | * [Which Context should I use in Android?](https://medium.com/@ali.muzaffar/which-context-should-i-use-in-android-e3133d00772c) 208 | * [Why Having Global Static References to Application Contexts is Probably not the Best Idea](https://www.philosophicalhacker.com/2015/07/14/why-static-references-to-application-contexts-are-probably-not-the-best-idea/) 209 | * [Android Context Needs Isolation](https://www.techyourchance.com/android-context-needs-isolation) 210 | * [Mastering Android context](https://medium.freecodecamp.org/mastering-android-context-7055c8478a22) 211 | * [Using Context Theme Wrapper](https://ataulm.github.io/2019/11/20/using-context-theme-wrapper.html) 212 | 213 | --- 214 | 215 | ## Fragment 216 | [back to top](#readme) 217 | * [Advocating Against Android Fragments](https://developer.squareup.com/blog/advocating-against-android-fragments/) 218 | * [Fragment Transactions & Activity State Loss](http://www.androiddesignpatterns.com/2013/08/fragment-transaction-commit-state-loss.html) 219 | * [Android Fragment Lifecycle for Professional Developers](https://www.techyourchance.com/android-fragment-lifecycle-for-professional-developers/) 220 | * [Lifecycle & Fragments backstack](https://medium.com/citerus/lifecycle-fragments-backstack-f32e34f012d5) 221 | * [[Youtube] Life Without Fragments](https://www.youtube.com/watch?v=jl1HRiCaAP4) 222 | * [From Fragments to Activity: the Lambda Way](https://medium.com/groupon-eng/from-fragments-to-activity-the-lambda-way-32c768c72aa9) 223 | * [Handling IllegalStateException: Can not perform this action after onSaveInstanceState](https://medium.com/@elye.project/handling-illegalstateexception-can-not-perform-this-action-after-onsaveinstancestate-d4ee8b630066) 224 | * [Android Fragments: FragmentContainerView](https://proandroiddev.com/android-fragments-fragmentcontainerview-292f393f9ccf) 225 | * [Android Fragments: FragmentFactory](https://proandroiddev.com/android-fragments-fragmentfactory-ceec3cf7c959) 226 | * [Fragment Lifecycles in the Age of Jetpack](https://zsmb.co/fragment-lifecycles-in-the-age-of-jetpack/) 227 | * [7 Common Mistakes Easily Made with Android Fragment](https://medium.com/mobile-app-development-publication/7-common-mistakes-easily-made-with-android-fragment-6fc85c44e783) 228 | * [An update to the FragmentViewBindingDelegate: the bug we’ve inherited from AutoClearedValue](https://itnext.io/an-update-to-the-fragmentviewbindingdelegate-the-bug-weve-inherited-from-autoclearedvalue-7fc0a89fcae1) 229 | 230 | --- 231 | 232 | ## Service 233 | [back to top](#readme) 234 | * [How to handle background services in Android O](https://medium.com/@kevalpatel2106/how-to-handle-background-services-in-android-o-f96783e65268) 235 | * [Exploring Background Execution Limits on Android Oreo](https://medium.com/exploring-android/exploring-background-execution-limits-on-android-oreo-ab384762a66c) 236 | * [Services. The life with/without. And WorkManager](https://medium.com/google-developer-experts/services-the-life-with-without-and-worker-6933111d62a6) 237 | * [Mastering Android Service of 2018](https://medium.com/mindorks/mastering-android-service-of-2018-a4a1df5ed5a6) 238 | * [The “misbehaving” foreground service in Android](https://proandroiddev.com/when-your-app-makes-android-foreground-services-misbehave-8dbcc57dd99c) 239 | 240 | --- 241 | 242 | ## Themes 243 | [back to top](#readme) 244 | * [Styling Colors & Drawables, Theme Attributes](https://www.androiddesignpatterns.com/2016/08/contextcompat-getcolor-getdrawable.html) 245 | * [[Yotube] Using Styles and Themes Without Going Crazy](https://www.youtube.com/watch?v=Jr8hJdVGHAk) 246 | * [Android Styling: Themes vs Styles](https://medium.com/androiddevelopers/android-styling-themes-vs-styles-ebe05f917578) 247 | 248 | --- 249 | 250 | ## Gradle 251 | [back to top](#readme) 252 | * [Gradle Tutorial for Android: Getting Started](https://www.raywenderlich.com/249-gradle-tutorial-for-android-getting-started) 253 | * [[Yotube] Speeding Up Your Android Gradle Builds](https://www.youtube.com/watch?v=7ll-rkLCtyk) 254 | * [Renaming Your Gradle Build Files](http://www.developerphil.com/renaming-your-gradle-build-files/) 255 | * [[Yotube] Gradle: From User to Addict](https://www.youtube.com/watch?v=-C7TtnPJ7ms) 256 | * [Experimenting with Gradle dependencies](http://alexfu.github.io/android/2017/11/07/experimenting-with-gradle-dependencies.html) 257 | * [Speed Up Your Android Project's Gradle Builds](https://dev.to/joshuadeguzman/speed-up-your-android-project-s-gradle-builds-1366) 258 | * [19 tips for Gradle in Android projects](https://medium.com/google-developer-experts/19-tips-for-gradle-in-android-projects-2019-edition-11af704eb06e) 259 | * [Tame Your Gradle Dependencies just because!](https://blog.blundellapps.co.uk/tame-your-gradle-dependencies-just-because/) 260 | * [Protecting secrets in an Android project](https://www.lordcodes.com/articles/protecting-secrets-in-an-android-project) 261 | * [A Bit of Gradle Housekeeping](https://zsmb.co/a-bit-of-gradle-housekeeping/) 262 | * [The Importance of Validating the Gradle Wrapper](https://jdvp.me/articles/Gradle-Wrapper-Validation) 263 | * [TOML + Gradle + project accessors](https://funkymuse.dev/posts/toml-gradle/) 264 | * [Integrate Version catalog in Android](https://blog.canopas.com/integrate-version-catalog-in-android-2f26d6fff3ea) 265 | * [Strategies for managing Gradle dependencies](https://proandroiddev.com/different-ways-to-manage-your-app-gradle-with-increasing-dependencies-count-e4105a16abb5) 266 | * [Impact of Dependency Tree Depth on Gradle Builds](https://www.droidchef.dev/impact-of-dependency-tree-depth-on-gradle-builds/) 267 | * [Different ways to handle Android Gradle dependencies](https://proandroiddev.com/different-ways-to-handle-android-gradle-dependencies-68ae00ca286c) 268 | * [sourceCompatibility, targetCompatibility, and JVM toolchains in Gradle explained](https://stefma.medium.com/sourcecompatibility-targetcompatibility-and-jvm-toolchains-in-gradle-explained-d2c17c8cff7c) 269 | * [Gradle Basics for Android Developers](https://medium.com/android-dev-corner/gradle-basics-for-android-developers-9d7a3bf062bb) 270 | * [Using Version Catalog on Android projects](https://proandroiddev.com/using-version-catalog-on-android-projects-82d88d2f79e5) 271 | * [Android Security: Securing your Gradle builds from baddies](https://proandroiddev.com/android-security-securing-your-gradle-builds-from-baddies-1dc30e1acf30) 272 | * [State of Dependency Management in Android Studio](https://proandroiddev.com/state-of-dependency-management-in-android-studio-a6ce647315f2) 273 | 274 | --- 275 | 276 | ## Architecture 277 | [back to top](#readme) 278 | * Architecture Components 279 | * [Android Architecture Components](https://proandroiddev.com/android-architecture-components-cb1ea88d3835) 280 | * [Introduction to Android Architecture Components](https://code.tutsplus.com/tutorials/introduction-to-android-architecture--cms-28749) 281 | * [Architecture Components - I'm not a purist but](http://hannesdorfmann.com/android/arch-components-purist) 282 | * [Background and Foreground events with Android Architecture Components](https://medium.com/@arturogdg/background-and-foreground-events-with-android-architecture-components-233fdd9fa855) 283 | * [5 common mistakes when using Architecture Components](https://proandroiddev.com/5-common-mistakes-when-using-architecture-components-403e9899f4cb) 284 | * [A WorkManager Pitfall: Modifying a Scheduled Worker](https://craigrussell.io/2019/04/a-workmanager-pitfall-modifying-a-scheduled-worker/) 285 | * [Workout your tasks with WorkManager](https://proandroiddev.com/workout-your-tasks-with-workmanager-intro-db5aefe14d66) 286 | * [Encapsulating View State](https://ryanharter.com/blog/2019/07/encapsulating-view-state/) 287 | * [Architecture Components pitfalls](https://medium.com/@BladeCoder/architecture-components-pitfalls-part-1-9300dd969808) 288 | * [SavedStateHandle to the Rescue](https://medium.com/making-meetup/savedstatehandle-to-the-rescue-bec7ce8257f1) 289 | * [Paging3 — Doing Recyclerview Pagination the Right Way](https://medium.com/swlh/paging3-recyclerview-pagination-made-easy-333c7dfa8797) 290 | * [The curious case of crashing Workers](https://jeroenmols.com/blog/2022/04/27/workmanager-crash/) 291 | * ViewModel 292 | * [Android ViewModel should be called scopedComponent](https://medium.com/@mattcarroll/android-viewmodel-should-be-called-scopedcomponent-ffcafdbd7a98) 293 | * [ViewModels: Persistence, onSaveInstanceState(), Restoring UI State and Loaders](https://medium.com/google-developers/viewmodels-persistence-onsaveinstancestate-restoring-ui-state-and-loaders-fc7cc4a6c090) 294 | * [ViewModels and LiveData: Patterns + AntiPatterns](https://medium.com/androiddevelopers/viewmodels-and-livedata-patterns-antipatterns-21efaef74a54) 295 | * [ViewModels: State persistence — SavedState](https://proandroiddev.com/viewmodels-state-persistence-savedstate-54d015acad82) 296 | * [When to load data in ViewModels](https://proandroiddev.com/when-to-load-data-in-viewmodels-ad9616940da7) 297 | * [Should I use Jetpack ViewModel?](https://www.glureau.com/2020/05/15/Jetpack-ViewModel-ProCons/) 298 | * [Dive deep into Android’s ViewModel — Android Architecture Components](https://android.jlelse.eu/dive-deep-into-androids-viewmodel-android-architecture-components-e0a7ded26f70) 299 | * [Composite ViewModel](https://www.halfbit.de/posts/composite-viewmodel/) 300 | * [Android ViewModel: Single state or not?](https://proandroiddev.com/android-viewmodel-single-state-or-not-d914f962d44c) 301 | * LiveData 302 | * [Concise Error Handling with LiveData and Retrofit](https://proandroiddev.com/concise-error-handling-with-livedata-and-retrofit-15937ceb555b) 303 | * [Using Realm with Kotlin and LiveData](https://proandroiddev.com/the-realm-of-kotlin-and-live-data-using-mvp-architecture-f04fc41c914e) 304 | * [When LiveData and Kotlin don’t play well together](https://medium.com/google-developer-experts/when-livedata-and-kotlin-dont-play-hand-in-hand-30149aa794ec) 305 | * [Avoid backing properties for LiveData and StateFlow](https://medium.com/google-developer-experts/avoid-backing-properties-for-livedata-and-stateflow-706006c9867e) 306 | * [When NOT to Use LiveData](https://proandroiddev.com/when-not-to-use-livedata-6a1245b054a6?gi=f5eaa6dafeb4) 307 | * Navigation 308 | * [AndroidX Navigation: Building on the Wrong Abstraction](https://proandroiddev.com/androidx-navigation-building-on-the-wrong-abstraction-1d7c4a64318c) 309 | * [How do we handle multi-modules navigation on our Android app](https://medium.com/back-market-engineering/how-we-handle-multi-modules-navigation-on-our-android-app-25319e62d219) 310 | * [Structural and navigation anti-patterns in multi-module and modularized applications](https://proandroiddev.com/structural-and-navigation-anti-patterns-in-modularized-android-applications-a7d667e35cd6) 311 | * [Jetpack Compose navigation architecture with ViewModels](https://proandroiddev.com/jetpack-compose-navigation-architecture-with-viewmodels-1de467f19e1c) 312 | * [MULTI-MODULE NAVIGATION IMPLEMENTATION WITH OUR ANDROID TEAM](https://choco.com/us/stories/life-at-choco/implementing-multi-module-navigation-android) 313 | * [In-app navigation wih coordinators](http://hannesdorfmann.com/android/coordinators-android) 314 | * [Problems With Navigation in Jetpack Compose](https://medium.com/profusion-engineering/problems-with-navigation-in-jetpack-compose-f1ef5536d94) 315 | * String 316 | * [Finding the right abstraction (when working with Strings)](https://hannesdorfmann.com/abstraction-text-resource/) 317 | * [Using String Resources in a ViewModel](https://medium.com/@margin555/using-string-resources-in-a-viewmodel-e334611b73da) 318 | * Other 319 | * [Weighing in on the Holy Architecture War](https://medium.com/@yonatanvlevin/weighing-in-on-the-holy-architecture-war-my-take-on-architecture-components-31f7025e9c66) 320 | * [Android Architecture Patterns Part 1: Model-View-Controller](https://medium.com/upday-devs/android-architecture-patterns-part-1-model-view-controller-3baecef5f2b6) 321 | * [Architectures of Android applications](https://medium.com/@bvmaks/architectures-of-android-applications-244a083bf132) 322 | * [Cargo Cult MVVM => The death knell of WPF](http://cargocultsoftwaredevelopment.blogspot.com/2010/10/cargo-cult-mvvm-death-knell-of-wpf.html) 323 | * [MVP to MVVM transformation](https://proandroiddev.com/mvp-to-mvvm-transformation-611959d5e0ca) 324 | * [[Youtube] Android Software Architecture by Example](https://www.youtube.com/watch?v=7t7MN8e1W7s) 325 | * [[Youtube] Half Way to clean architecture](https://www.youtube.com/watch?v=R89ufpJI3SY) 326 | * [[Youtube] Application Architecture: Designing Offline Application Case Studies](https://www.youtube.com/watch?v=n8nG5K_3BJM) 327 | * [Netflix Shows The Future of Android Architecture](https://www.techyourchance.com/netflix-shows-the-future-of-android-architecture/) 328 | * [MVVM with architecture components: a step by step guideline for MVP lovers](https://antonioleiva.com/mvvm-vs-mvp/) 329 | * [Flexible way to handle exceptions in Android](https://android.jlelse.eu/flexible-way-to-handle-exceptions-in-android-9de236f304ad) 330 | * [MVI - The Good, the Bad, and the Ugly](https://adambennett.dev/2019/07/mvi-the-good-the-bad-and-the-ugly/) 331 | * [Anemic Repositories, MVI and RxJava-induced design damage, and how AAC ViewModel is silently killing your app](https://proandroiddev.com/anemic-repositories-mvi-and-rxjava-induced-design-damage-and-how-aac-viewmodel-is-silently-1762caa70e13) 332 | * [MVC/MVP/MVVM/CLEAN/VIPER/REDUX/MVI/PRNSAASPFRUICC — building abstractions for the sake of building abstractions](https://proandroiddev.com/mvc-mvp-mvvm-clean-viper-redux-mvi-prnsaaspfruicc-building-abstractions-for-the-sake-of-building-18459ab89386) 333 | * [Say no to BaseActivity and BaseFragment](https://proandroiddev.com/say-no-to-baseactivity-and-basefragment-83b156ed8998) 334 | * [Building An Application With MVVM](https://androidessence.com/building-an-app-with-mvvm) 335 | * [Multiple ways of defining Clean Architecture layers](https://proandroiddev.com/multiple-ways-of-defining-clean-architecture-layers-bbb70afa5d4a) 336 | * [MVWTF: Demystifying Architecture Patterns](https://androidessence.com/mvwtf) 337 | * [Repository Pattern: Properly Organizing Your Data Layer](https://androidessence.com/repository-pattern) 338 | * [Android: Error handling in Clean Architecture](https://proandroiddev.com/android-error-handling-in-clean-architecture-844a7fc0dc03) 339 | * [Designing and Working with Single View States on Android](https://zsmb.co/designing-and-working-with-single-view-states-on-android/) 340 | * [Thoughts about State Handling on Android](https://zsmb.co/thoughts-about-state-handling-on-android/) 341 | * [Repository initialization without StrictMode violations](https://proandroiddev.com/repository-initialization-without-strictmode-violations-fbbd6e554219) 342 | * [Our Way to MVVMI and Mistakes We Made When Implementing MVVM](https://proandroiddev.com/our-way-to-mvvmi-and-mistakes-we-made-when-implementing-mvvm-5f5448b5ad50) 343 | * [Architecture in Jetpack Compose — MVP, MVVM, & MVI](https://medium.com/mobile-at-octopus-energy/architecture-in-jetpack-compose-mvp-mvvm-mvi-17d8170a13fd) 344 | * [Traditional MVVM with Jetpack Compose and StateFlow](https://proandroiddev.com/traditional-mvvm-with-jetpack-compose-and-stateflow-7ca934e12784) 345 | * [The ABC of Modularization for Android in 2021](https://proandroiddev.com/the-abc-of-modularization-for-android-in-2021-e7b3fbe29fca) 346 | * [Practical Modularisation for Android Developers](https://jordanterry.co.uk/practical-modularisation-for-android-developers) 347 | * [Domain-Specific Models](https://blog.danlew.net/2022/08/15/domain-specific-models/) 348 | * [How To Avoid Use Cases Boilerplate in Android](https://betterprogramming.pub/how-to-avoid-use-cases-boilerplate-in-android-d0c9aa27ef27) 349 | * [The famous and unthought MVI misconception in Android, alongside MVVM](https://funkymuse.dev/posts/the-story-of-mvi/) 350 | * [Adding a domain layer](https://medium.com/androiddevelopers/adding-a-domain-layer-bc5a708a96da) 351 | * [Principles & Practice in Repository Layer](https://proandroiddev.com/principles-practice-in-repository-layer-444551b96cf8) 352 | * [Interface Naming Conventions](https://androiddev.blog/interface-naming-conventions/) 353 | * [Injection Points](https://marcellogalhardo.dev/posts/injection-points/) 354 | * [Modelling the domain layer using composable use cases](https://rafagarcia.dev/modelling-the-domain-layer-using-composables-use-cases/) 355 | * [Guide to Android app modularization](https://developer.android.com/topic/modularization) 356 | * [Modern Android Development in 2023](https://devjorgecastro.medium.com/modern-android-app-development-in-2023-ff445d3652b4) 357 | * [How to Implement MVI with Delegates on Android](https://engineering.teknasyon.com/how-to-implement-mvi-with-delegates-on-android-f2aa1a842b73) 358 | * [A new way of handling one-off events in your Android application (and even more)](https://medium.com/@rom.andrushchenko/a-new-way-of-handling-one-off-events-in-android-application-85c642a50334) 359 | 360 | --- 361 | 362 | ## IDE 363 | [back to top](#readme) 364 | * [Live Template for RecyclerView Adapter in Android Studio](https://tech.fleka.me/live-template-for-recyclerview-adapter-in-android-studio-5a4e7342bffc) 365 | * [Add Logs Without Using Code](https://android.jlelse.eu/add-logs-without-using-code-bd49fe9202ca) 366 | * [Bringing more colour to Android Studio](https://medium.com/a-problem-like-maria/bringing-more-colour-to-android-studio-18bb45017106) 367 | * [Android Memory Profiler](https://www.raywenderlich.com/4557771-android-memory-profiler-getting-started) 368 | * [git rm --cached ./idea?](https://dev.to/redbassett/git-rm-cached-idea-4cec) 369 | * [Add custom live templates in Android Studio](https://proandroiddev.com/add-custom-live-templates-in-android-studio-11b59dd0284d) 370 | * [Split layouts into subfolders in Android Studio](https://proandroiddev.com/split-layout-into-subfolder-in-android-5bf76f805e90) 371 | * [Android Studio Design Tools UX — Split View](https://medium.com/androiddevelopers/android-studio-design-tools-ux-changes-split-view-dcde75e88a0c) 372 | * [Scratch That Itch](https://zdominguez.com/2019/11/21/scratch-files.html) 373 | * [TODO Live Templates](https://zarah.dev/2020/03/06/live-templates.html) 374 | * [Accommodate your project-specific needs with custom templates](https://proandroiddev.com/accommodate-your-project-specific-needs-with-custom-templates-46cfdccc8363) 375 | * [Background Task Inspector](https://medium.com/androiddevelopers/background-task-inspector-30c8706f0380) 376 | * [Debugging like a pro in Android Studio](https://medium.com/helpshift-engineering/debugging-like-a-pro-in-android-studio-8c6547825961) 377 | * [Android Debugging](https://blog.protein.tech/android-debugging-8dee028d77e5) 378 | * [Android Developer Options that you probably forgot](https://medium.com/@DoesitPew/android-developer-options-that-you-probably-forgot-431e31d4c5fc) 379 | * [Spot your UI jank using CPU profiler in Android Studio](https://medium.com/androiddevelopers/spot-your-ui-jank-using-cpu-profiler-in-android-studio-9a4c41a54dab) 380 | * [My Top 7 Most Underrated IntelliJ IDEA Features](https://betterprogramming.pub/my-top-7-most-underrated-intellij-idea-features-572b0b706bd6) 381 | * [Things you can do in Android Studio](https://adambennett.dev/2022/06/things-you-can-do-in-android-studio/) 382 | * [Quick tip: finetune your Android Studio and IntelliJ Welcome screen](https://dev.to/tkuenneth/quick-tip-finetune-your-android-studio-and-intellij-welcome-screen-42m6) 383 | * [Android Studio's "I'm Feeling Lucky" Button](https://www.zacsweers.dev/android-studios-im-feeling-lucky-button/) 384 | * [See Crashlytics issue reports directly in Android Studio with App Quality Insights](https://medium.com/androiddevelopers/see-crashlytics-issue-reports-directly-in-android-studio-with-app-quality-insights-db0ff27454f0) 385 | * [Android Studio — Hide generated files from search results](https://blog.protein.tech/android-studio-hide-generated-files-from-search-results-380298e6be83) 386 | * [Don’t scratch your head, scratch the files instead](https://proandroiddev.com/dont-scratch-your-head-scratch-the-files-instead-3a00743fdded) 387 | 388 | --- 389 | 390 | ## Other 391 | [back to top](#readme) 392 | * Main 393 | * [Identifying an Android Device](http://handstandsam.com/2017/05/04/identifying-an-android-device/) 394 | * [Streamlining eero’s Android build process](https://medium.com/@jordanjoz/streamlining-eeros-android-build-process-6a870ef40a89#.svunhmwgi) 395 | * [An introduction to Android Instant Apps](https://willowtreeapps.com/ideas/an-introduction-to-android-instant-apps) 396 | * [Going multiprocess on Android](https://medium.com/@rotxed/going-multiprocess-on-android-52975ed8863c) 397 | * [Exploring the Android EmojiCompat Library](https://medium.com/exploring-android/exploring-the-android-emoji-compatibility-library-1b9f3bb724aa) 398 | * [Optimizing the Performance of Vector Drawables](https://upday.github.io/blog/vector_drawables_optimisation/) 399 | * [Task Stack](https://blog.stylingandroid.com/task-stack/) 400 | * [Understanding Activity.runOnUiThread()](https://medium.com/@yossisegev/understanding-activity-runonuithread-e102d388fe93) 401 | * [Safe-Integration of Realm in Android production code](https://medium.com/@Viraj.Tank/realm-integration-in-android-best-practices-449919d25f2f) 402 | * [How to Correctly Store App-Specific Files in Android](https://www.grokkingandroid.com/how-to-correctly-store-app-specific-files-in-android/) 403 | * [Sharing Content between Android apps](https://medium.com/androiddevelopers/sharing-content-between-android-apps-2e6db9d1368b) 404 | * [Exploring the Android App Bundle](https://medium.com/google-developer-experts/exploring-the-android-app-bundle-ca16846fa3d7) 405 | * [[Yotube] Timing is Everything: How to use Timer, Handler, and AlarmManager](https://www.youtube.com/watch?v=CzNFjCQhCV0) 406 | * [[Yotube] Requesting Permissions at Run Time](https://www.youtube.com/watch?v=WGz-alwVh8A) 407 | * [[Yotube] How the Main Thread works](https://www.youtube.com/watch?v=eAtMon8ndfk) 408 | * [[Yotube] Exploring Custom Activity Transitions](https://www.youtube.com/watch?v=HLhA0I00TnI) 409 | * [[Yotube] Tools of the Trade](https://www.youtube.com/watch?v=AeoeD7K8vKI) 410 | * [TransactionTooLargeException on Nougat solved](https://medium.com/@mdmasudparvez/android-os-transactiontoolargeexception-on-nougat-solved-3b6e30597345) 411 | * [Large Database Queries on Android](https://medium.com/androiddevelopers/large-database-queries-on-android-cb043ae626e8) 412 | * [Understanding Android Matrix transformations](https://medium.com/a-problem-like-maria/understanding-android-matrix-transformations-25e028f56dc7) 413 | * [Developing Secure Android Apps](https://proandroiddev.com/developing-secure-android-apps-8edad978d8ba) 414 | * [Unwrapping Framework Binding Adapters](https://zdominguez.com/2019/02/15/framework-binders.html) 415 | * [Android CPU, Compilers, D8 & R8](https://proandroiddev.com/android-cpu-compilers-d8-r8-a3aa2bfbc109) 416 | * [[Yotube] From AlarmManager to WorkManager](https://www.youtube.com/watch?v=TCylj3i5cXI) 417 | * [[Yotube] Working Effectively with (Android) Legacy Code](https://www.youtube.com/watch?v=xsoQpcvGZgI) 418 | * [A Little Thing about Android Module Paths](https://medium.com/androiddevelopers/gradle-path-configuration-dc523f0ed25c) 419 | * [[Yotube] Understanding Android's Message Queue](https://www.youtube.com/watch?v=7H7zAtE3ki0) 420 | * [Saving secrets with buildSrc](https://bloggie.io/@_junrong/android-saving-secrets-with-buildsrc) 421 | * [Holiday clean up or cute versioning in android](https://treatwell.engineering/holiday-clean-up-or-cute-versioning-in-android-bf02356dd07f) 422 | * [Divide and conquer](https://treatwell.engineering/divide-and-conquer-6604084e3f41) 423 | * [TimingLogger: An idiomatic Android approach to measuring execution time](https://itnext.io/timinglogger-an-idiomatic-android-approach-to-measuring-execution-time-8ac10a8fa0ba) 424 | * [Android ProcessLifecycleOwner by example](https://proandroiddev.com/android-processlifecycleowner-by-example-2f965061b9da) 425 | * [Coil vs Picasso vs Glide: Get Ready… Go!](https://proandroiddev.com/coil-vs-picasso-vs-glide-get-ready-go-774add8cfd40) 426 | * [How to Use Shared Element Transition with Glide in 4 steps](https://www.thedroidsonroids.com/blog/how-to-use-shared-element-transition-with-glide-in-4-step) 427 | * [Hidden mistakes with Shared Element Transitions](https://medium.com/redmadrobot-mobile/hidden-mistakes-with-shared-element-transitions-65d79831c63) 428 | * [Don’t use Base64 encoded images on mobile](https://medium.com/snapp-mobile/dont-use-base64-encoded-images-on-mobile-13ddeac89d7c) 429 | * [Mobile App Versioning: A Numbers Game](https://medium.com/@daptronic/mobile-app-versioning-a-numbers-game-f1ea9dbd1ded) 430 | * [Simple Guide to Android Product Flavors](https://levelup.gitconnected.com/simple-guide-to-android-product-flavors-674106455038) 431 | * [Encrypting Shared Preferences with the AndroidX Security Library](https://www.bignerdranch.com/blog/encrypting-shared-preferences-with-the-androidx-security-library/) 432 | * [Reduce Overdraw from Your Android Application](https://android.jlelse.eu/reduce-overdraw-from-your-android-application-6cf15f4aa85f) 433 | * [Showing the Android Keyboard Reliably](https://developer.squareup.com/blog/showing-the-android-keyboard-reliably/) 434 | * [Data Encryption on Android with Jetpack Security](https://android-developers.googleblog.com/2020/02/data-encryption-on-android-with-jetpack.html) 435 | * [Evolution of Finding Views by ID in Android](https://wajahatkarim.com/2020/04/evolution-of-finding-views/) 436 | * [App Standby Buckets In Android](https://medium.com/mindorks/app-standby-buckets-in-android-ada2d2929350) 437 | * [Make Android View Binding great with Kotlin](https://proandroiddev.com/make-android-view-binding-great-with-kotlin-b71dd9c87719) 438 | * [The First 2 Commits Every Android Project Should Have](https://medium.com/livefront/the-first-2-commits-every-android-project-should-have-e8a245ac86) 439 | * [8 Valid Reasons for Modularization in Android](https://www.techyourchance.com/modularization-android) 440 | * [5 Most Popular Package Structures for Software Projects](https://www.techyourchance.com/popular-package-structures/) 441 | * [Low-level implementation of array](https://medium.com/swlh/low-level-implementation-of-array-b4654d4e28ca) 442 | * [Android Logging on Steroids: Clickable Logs With Location Info](https://medium.com/@.me./android-logging-on-steroids-clickable-logs-with-location-info-de1a5c16e86f) 443 | * [Easy Android Scopes](https://ryanharter.com/blog/2020/03/easy-android-scopes/) 444 | * [The Bifurcation Of Android](https://medium.com/nala-money/the-bifurcation-of-android-6fa1cced074d) 445 | * [Remote logging with Timber and Firebase Realtime Database](https://proandroiddev.com/remote-logging-with-timber-and-firebase-realtime-database-a9dfbe66284c) 446 | * [A few experiments with Android drawable gradients](https://blog.jakelee.co.uk/a-few-experiments-with-android-drawable-gradients/) 447 | * [Assets or Resource Raw folder of Android?](https://medium.com/mobile-app-development-publication/assets-or-resource-raw-folder-of-android-5bdc042570e0) 448 | * [Android Widgets](https://medium.com/android-bits/android-widgets-ad3d166458d3) 449 | * [Simple one-liner ViewBinding in Fragments and Activities with Kotlin](https://medium.com/@Zhuinden/simple-one-liner-viewbinding-in-fragments-and-activities-with-kotlin-961430c6c07c) 450 | * [Data Binding — Lessons learnt](https://medium.com/androiddevelopers/data-binding-lessons-learnt-4fd16576b719) 451 | * [Dark Theme with MDC](https://medium.com/androiddevelopers/dark-theme-with-mdc-4c6fc357d956) 452 | * [Supercharge Android dev with Scrcpy and ADB WIFI](https://proandroiddev.com/supercharge-android-dev-with-scrcpy-and-adb-wifi-f286091c72fc) 453 | * [Building on the Wrong Abstraction](https://publicobject.com/2020/09/24/building-on-the-wrong-abstraction/) 454 | * [Android ImageView AdjustViewBounds Demystified](https://medium.com/mobile-app-development-publication/android-imageview-adjustviewbounds-demystified-2f91ce7fe349) 455 | * [Busting Android performance myths](https://medium.com/androiddevelopers/busting-android-performance-myths-d85ae1d87f22) 456 | * [Android WiFi Scanning Frustrations](https://proandroiddev.com/android-wifi-scanning-frustrations-799d1d942aea) 457 | * [Modern Android Security Development](https://proandroiddev.com/modern-android-security-development-f84796824cea) 458 | * [The Ultimate Guide to Android Bluetooth Low Energy](https://punchthrough.com/android-ble-guide/) 459 | * [All you need to know about ArrayMap & SparseArray](https://proandroiddev.com/all-you-need-to-know-about-arraymap-sparsearray-49759c2ecbf9) 460 | * [Understand the types of Launch Modes in an Android Activity](https://mohamedyousufmo.medium.com/understand-android-activity-launch-mode-c21fcecf04b8) 461 | * [Demystifying Locale on Android](https://juliensalvi.medium.com/demystifying-locale-on-android-95450adf5aec) 462 | * [Keeping Secrets Safe in Android Projects](https://infinum.com/the-capsized-eight/secrets-android-projects) 463 | * [[Youtube] Trash Talk: The Evolution of Android Garbage Collection](https://www.youtube.com/watch?v=oKMsPrDMprE) 464 | * [Android Runtime — How Dalvik and ART work?](https://proandroiddev.com/android-runtime-how-dalvik-and-art-work-6e57cf1c50e5) 465 | * [Decrease memory usage of your Android app in half](https://proandroiddev.com/decrease-memory-usage-of-your-android-app-in-half-a65524d7380b) 466 | * [Measure and optimize bitmap size using Glide or Picasso](https://proandroiddev.com/measure-and-optimize-bitmap-size-using-glide-or-picasso-3273b4a569cd) 467 | * [From zero to hero: Optimizing Android app startup time](https://medium.com/skoumal-studio/from-zero-to-hero-optimizing-android-app-startup-time-eda9022c0963) 468 | * [All About PendingIntents](https://medium.com/androiddevelopers/all-about-pendingintents-748c8eb8619) 469 | * [Delay with respect of lifecycle](https://proandroiddev.com/delay-with-respect-of-lifecycle-6ee3f0f65e24) 470 | * [Detect Screenshots in Android](https://proandroiddev.com/detect-screenshots-in-android-7bc4343ddce1) 471 | * [Insecure TLS Certificate Checking in Android Apps](https://www.guardsquare.com/blog/insecure-tls-certificate-checking-in-android-apps) 472 | * [Integrating detekt in the Workflow](https://www.raywenderlich.com/24470020-integrating-detekt-in-the-workflow) 473 | * [Reverse Engineer Your Favorite Android App](https://medium.com/helpshift-engineering/reverse-engineer-your-favorite-android-app-863a797042a6) 474 | * [Accessing App Usage History In Android](https://proandroiddev.com/accessing-app-usage-history-in-android-79c3af861ccf) 475 | * [The Case of the Disappearing Days](https://chrishorner.codes/post/debugging-dates/) 476 | * [Two targets, one arrow: Cutting down our app size and startup time on Android](https://www.gojek.io/blog/how-we-reduced-our-app-size) 477 | * [All about Preferences DataStore](https://medium.com/androiddevelopers/all-about-preferences-datastore-cc7995679334) 478 | * [Using DataStore With Kotlin Serialization](https://medium.com/androiddevelopers/using-datastore-with-kotlin-serialization-6552502c5345) 479 | * [Android Vitals - Diving into cold start waters](https://dev.to/pyricau/android-vitals-diving-into-cold-start-waters-5hi6) 480 | * [When “Compat” libraries won’t save you](https://proandroiddev.com/when-compat-libraries-do-not-save-you-dc55f16b4160) 481 | * [How OkCredit Android App improved Cold Startup by 70%](https://medium.com/okcredit/how-okcredit-android-app-improved-cold-startup-by-70-e02bda4836a8) 482 | * [Memory Leaks in Reactive Android Programming](https://proandroiddev.com/memory-leaks-in-reactive-android-programming-a4ad2b34466a) 483 | * [Ten #AndroidLifeHacks You Can Use Today](https://gpeal.medium.com/ten-androidlifehacks-you-can-use-today-9f74186fc207) 484 | * [Making Sense of Intent Filters in Android 13](https://medium.com/androiddevelopers/making-sense-of-intent-filters-in-android-13-8f6656903dde) 485 | * [Migrate The Deprecated OnBackPressed Function — Android 13](https://proandroiddev.com/migrate-the-deprecated-onbackpressed-function-android-13-d0d556244272) 486 | * [3 Ways to Secure Secret Keys in Android](https://medium.com/@maydin/3-ways-to-secure-secret-keys-in-android-ccd9adaadb82) 487 | * [Background restrictions in Android](https://medium.com/its-tinkoff/android-background-restrictions-b63e73fe508) 488 | * [6 Types of Encryption That You Must Know About](https://www.goodcore.co.uk/blog/types-of-encryption/) 489 | * [Text Will Not Always Scale](https://commonsware.com/blog/2023/07/08/text-will-not-always-scale.html) 490 | * [Not All ViewBinding Need Null Setting](https://medium.com/mobile-app-development-publication/not-all-viewbinding-need-null-setting-e16fe6737489) 491 | * [What Are Dynamic App Shortcuts?](https://proandroiddev.com/what-are-dynamic-app-shortcuts-d76ab680edf1) 492 | * Net 493 | * [Various methods to debug HTTP traffic in Android applications](https://proandroiddev.com/various-methods-to-debug-http-traffic-in-the-android-application-8685b9183418) 494 | * [Four Ways to Bypass Android SSL Verification and Certificate Pinning](https://blog.netspi.com/four-ways-bypass-android-ssl-verification-certificate-pinning/) 495 | * [Securing Network and Inter-App Communications on Android](https://heartbeat.fritz.ai/securing-network-and-inter-app-communications-in-android-c733baa5057c) 496 | * [Listening to connectivity changes, using NetworkCallbacks. NetworkInfo APIs are days of yore.](https://medium.com/@kiitvishal89/android-listening-to-connectivity-changes-the-correct-way-a614f0d6d2af) 497 | * ProGuard 498 | * [Practical ProGuard rules examples](https://medium.com/google-developers/practical-proguard-rules-examples-5640a3907dc9) 499 | * [Troubleshooting ProGuard issues on Android](https://medium.com/androiddevelopers/troubleshooting-proguard-issues-on-android-bce9de4f8a74) 500 | * [[Yotube] Bulletproof Android](https://www.youtube.com/watch?v=1yF5sqGJo90) 501 | * [Is Your Kotlin Code Really Obfuscated?](https://proandroiddev.com/is-your-kotlin-code-really-obfuscated-a36abf033dde) 502 | * [Android's Built-in ProGuard Rules: The Missing Guide](https://www.zacsweers.dev/android-proguard-rules/) 503 | * [Understand Proguard Generated Files and Manually De-obfuscate Stacktrace](https://medium.com/mobile-app-development-publication/understand-proguard-generated-files-and-manually-de-obfuscate-stacktrace-6ae7c8efa59d) 504 | * [Keep Rules in the Age of Kotlin](https://www.guardsquare.com/blog/keep-rules-in-the-age-of-kotlin) 505 | * APK/Multidex 506 | * [65K methods](https://medium.com/@rotxed/dex-skys-the-limit-no-65k-methods-is-28e6cb40cf71) 507 | * [Android APK signature scheme v3](https://www.guardsquare.com/en/blog/android-apk-signature-scheme-v3-context-and-new-opportunities) 508 | * [[Yotube] Understanding and Experimenting with MultiDex](https://www.youtube.com/watch?v=skmOBriQ28E) 509 | * [My Journey on Reducing APK size at GetMega](https://proandroiddev.com/my-journey-on-reducing-apk-size-at-getmega-977aabf18068) 510 | * Memory leak 511 | * [Android leak pattern: subscriptions in views](https://medium.com/square-corner-blog/android-leak-pattern-subscriptions-in-views-18f0860aa74c) 512 | * [Our battle with the OutOfMemory army](https://medium.com/lalafo-engineering/our-battle-with-the-outofmemory-army-bd6b384f1f0c) 513 | * [Reliable Hot Reload on Android](https://medium.com/@gpeal/reliable-hot-reload-on-android-27f14a80df60) 514 | * [Detecting memory leaks in Android applications](https://dropbox.tech/mobile/detecting-memory-leaks-in-android-applications) 515 | * [Everything you need to know about Memory Leaks in Android](https://proandroiddev.com/everything-you-need-to-know-about-memory-leaks-in-android-d7a59faaf46a) 516 | * Lint/Static analysis 517 | * [[Yotube] Linty Fresh](https://www.youtube.com/watch?v=YseGWp7iouM) 518 | * [Multi-module Lint Rules](https://zarah.dev/2021/10/04/multi-module-lint.html) 519 | * [Multi-module Lint Rules Follow Up: Suppressions](https://zarah.dev/2022/02/15/deprecated-suppress.html) 520 | * [Enforcing Custom View Usage With Android Lint](https://androidessence.com/enforce-custom-views-with-lint) 521 | * [Static analysis tools for Android](https://proandroiddev.com/static-analysis-tools-for-android-9531334954f6) 522 | * [Kotlin Static Analysis — why and how?](https://proandroiddev.com/kotlin-static-analysis-why-and-how-a12042e34a98) 523 | * [Compiler Warnings Are Good, Actually](https://publicobject.com/2022/02/02/compiler-warnings-are-good-actually/) 524 | * [Increasing Android Lint Terminal Results](https://jdvp.me/articles/Android-Terminal-Linting) 525 | * [Automation of code analysis in Android projects](https://proandroiddev.com/automating-analyzing-of-code-in-android-projects-a60313569c53) 526 | * [Introducing Konsist: A Cutting-Edge Kotlin Linter](https://blog.kotlin-academy.com/introducing-konsist-a-cutting-edge-kotlin-linter-d3ab916a5461) 527 | * [Stop Debating in Code Reviews. Start Enforcing with Lint Rules](https://proandroiddev.com/stop-debating-in-code-reviews-start-enforcing-with-lint-rules-6632c907ea94) 528 | * [First Look: Using Google Open-source Android Security Lint Library](https://medium.com/@mickcolai/first-look-using-google-open-source-android-security-lint-library-eeaf183ef642) 529 | * Room 530 | * [Understanding migrations with Room](https://medium.com/androiddevelopers/understanding-migrations-with-room-f01e04b07929) 531 | * [Room auto-migrations](https://medium.com/androiddevelopers/room-auto-migrations-d5370b0ca6eb) 532 | * [Android Room Hidden Costs](https://krossovochkin.com/posts/2020_12_18_android_room_hidden_costs/) 533 | 534 | --- 535 | 536 | # Programming language 537 | 538 | ## Kotlin 539 | [back to top](#readme) 540 | * Data Classes 541 | * [Creating multiple constructors for Data classes in Kotlin](https://medium.com/proandroiddev/creating-multiple-constructors-for-data-classes-in-kotlin-32ad27e58cac) 542 | * [Representing View State with Kotlin Data Classes](https://medium.com/@trionkidnapper/viewmodel-and-kotlin-data-class-7d3a3b854805) 543 | * [Data Classes are The Best Kotlin Feature](https://www.techyourchance.com/data-classes-best-kotlin-feature/) 544 | * [Kotlin data classes and sensitive information](https://mustafaali.net/2018/01/14/Kotlin-data-classes-and-sensitive-information/) 545 | * [Data classes aren't (that) magical](https://zsmb.co/data-classes-arent-that-magical/) 546 | * [Prefer Data Classes Over Pairs](https://proandroiddev.com/prefer-data-classes-over-pairs-42b8a39e5e37) 547 | * Sealed Classes 548 | * [Modeling ViewModel States Using Kotlin’s Sealed Classes](https://engineering.udacity.com/modeling-viewmodel-states-using-kotlins-sealed-classes-a5d415ed87a7) 549 | * [Simplify your Android code by delegating to sealed classes](https://medium.com/halcyon-mobile/simplify-your-android-code-by-delegating-to-sealed-classes-99304c509321) 550 | * [Kotlin Sealed Classes — enums with swag](https://proandroiddev.com/kotlin-sealed-classes-enums-with-swag-d3c4b799bcd4) 551 | * [Kotlin pearls: Sealed Class Override](https://proandroiddev.com/kotlin-pearls-sealed-class-override-b951dcd752c6) 552 | * [Abstracting Kotlin Sealed Classes](https://arturdryomov.dev/posts/abstracting-kotlin-sealed-classes/) 553 | * [You may not need a sealed class](https://medium.com/@patxi/you-may-not-need-a-sealed-class-fe4551e800b4) 554 | * [Enum vs Sealed class — which one to choose?](https://blog.kotlin-academy.com/enum-vs-sealed-class-which-one-to-choose-dc92ce7a4df5) 555 | * [Dealing with Multiple APIs via Retrofit? Learn How to use Sealed Classes Effectively](https://medium.com/@bhavnathacker14/dealing-with-multiple-apis-via-retrofit-learn-how-to-use-sealed-classes-effectively-eee01b2bff45) 556 | * Delegates 557 | * [Kotlin is Dope And So Are Its Custom Property Delegates](https://robots.thoughtbot.com/kotlin-is-dope-and-so-are-its-custom-property-delegates) 558 | * [Kotlin — Faster Lazy for Android](https://proandroiddev.com/kotlin-faster-lazy-for-android-7328ec8d8d57) 559 | * [The magic in Kotlin: Delegates](https://proandroiddev.com/the-magic-in-kotlin-delegates-377d27a7b531) 560 | * [Kotlin delegates in Android development](https://proandroiddev.com/kotlin-delegates-in-android-development-part-2-2c15c11ff438) 561 | * [Simpler Kotlin class hierarchies using class delegation](https://proandroiddev.com/simpler-kotlin-class-hierarchies-using-class-delegation-35464106fed5) 562 | * [Under the hood of Kotlin Class Delegation](https://medium.com/snapp-mobile/under-the-hood-of-kotlin-class-delegation-24d53f9aa924) 563 | * [Advanced Kotlin - Delegates](https://americanexpress.io/advanced-kotlin-delegates/) 564 | * [Effective Class Delegation](https://zsmb.co/effective-class-delegation/) 565 | * [Interface Delegation in Kotlin](https://poisonedyouth.github.io/Kotlin-Interface-Delegation) 566 | * Type System 567 | * [Kotlin Type Hierarchy](http://natpryce.com/articles/000818.html) 568 | * [Nothing (else) matters in Kotlin](https://proandroiddev.com/nothing-else-matters-in-kotlin-994a9ef106fc) 569 | * [Kotlin’s ‘Nothing’ Type](https://proandroiddev.com/kotlins-nothing-type-946de7d464fb) 570 | * [The Ins and Outs of Generic Variance in Kotlin](https://typealias.com/guides/ins-and-outs-of-generic-variance/) 571 | * [Kotlin — Mastering generics nullability](https://medium.com/@igorwojda/kotlin-deep-dive-into-generics-nullability-9853d9a9f50d) 572 | * [All About Type Aliases in Kotlin](https://typealias.com/guides/all-about-type-aliases/) 573 | * [An Illustrated Guide to Covariance and Contravariance in Kotlin](https://typealias.com/guides/illustrated-guide-covariance-contravariance/) 574 | * [Null is your friend, not a mistake](https://medium.com/@elizarov/null-is-your-friend-not-a-mistake-b63ff1751dd5) 575 | * [Kotlin’s Nothing: Its Usefulness in Generics](https://blog.kotlin-academy.com/kotlins-nothing-its-usefulness-in-generics-5076a6a457f7) 576 | * [Understanding Kotlin limitations for type parameter positions](https://blog.kotlin-academy.com/understanding-kotlin-limitations-for-type-parameter-positions-15527b916034) 577 | * [Any, Unit, Nothing and all their friends](https://medium.com/@patxi/any-unit-nothing-and-all-their-friends-e39613b48235) 578 | * [The power of types for errors](https://proandroiddev.com/the-power-of-types-for-errors-42e2325ed9c5) 579 | * [JvmSuppressWildcards: The secret sauce to your sandwich-style generics](https://chao2zhang.medium.com/jvmsuppresswildcards-the-secret-sauce-to-your-sandwich-style-generics-b0093aa5979d) 580 | * Properties 581 | * [Kotlin and Android — Treacherous properties](https://tips.seebrock3r.me/kotlin-and-android-2-treacherous-properties-562966242c2d) 582 | * [Kotlin: should I define Function or Property?](https://blog.kotlin-academy.com/kotlin-should-i-define-function-or-property-6786951da909) 583 | * Android 584 | * [How kotlin became our primary language for android](https://medium.com/uptech-team/how-kotlin-became-our-primary-language-for-android-3af7fd6a994c#.hj4k8m25l) 585 | * [Starting Activities with Kotlin](https://medium.com/@passsy/starting-activities-with-kotlin-my-journey-8b7307f1e460) 586 | * [Kotlin + buildSrc for Better Gradle Dependency Management](https://handstandsam.com/2018/02/11/kotlin-buildsrc-for-better-gradle-dependency-management/) 587 | * [The danger of assumptions: Kotlin with Android custom views](https://blog.q42.nl/the-danger-of-assumptions-kotlin-with-android-custom-views-adb79bf2da45) 588 | * [A Better Way to Launch Activities on Android](https://medium.com/capital-one-developers/a-better-way-to-launch-activities-on-android-8a1045181b16) 589 | * [Hacking Architecture Components by using Kotlin](https://antonioleiva.com/architecture-components-kotlin/) 590 | * [Custom attributes using BindingAdapters in Kotlin](https://proandroiddev.com/custom-attributes-using-bindingadapters-in-kotlin-971ef8fcc259) 591 | * [Kotlin Android Extensions: Using View Binding the right way](https://proandroiddev.com/kotlin-android-extensions-using-view-binding-the-right-way-707cd0c9e648) 592 | * [Making the Android Studio Layout Editor Better With Kotlin](https://medium.com/@edwardharks/making-the-android-studio-layout-editor-better-with-kotlin-997ca0653923) 593 | * [Kotlin for Android Developers: Visibility Modifiers](https://medium.com/mindorks/kotlin-for-android-developers-visibility-modifiers-8d8a3b84d298) 594 | * [JvmOverloads for Android Views](https://zsmb.co/jvmoverloads-for-android-views/) 595 | * [Misconception about Kotlin @JvmOverloads for Android View Creation](https://proandroiddev.com/misconception-about-kotlin-jvmoverloads-for-android-view-creation-cb88f432e1fe) 596 | * Coroutines 597 | * [[Youtube] Asynchronous Programming with Kotlin](https://www.youtube.com/watch?v=krfGMLuhB8M) 598 | * [Coroutines: first things first](https://medium.com/androiddevelopers/coroutines-first-things-first-e6187bf3bb21) 599 | * [Android Kotlin Coroutine Best Practices](https://medium.com/@kenkyee/android-kotlin-coroutine-best-practices-bc033fed62e7) 600 | * [Launching a Kotlin Coroutine for immediate execution on the Main thread](https://medium.com/@trionkidnapper/launching-a-kotlin-coroutine-for-immediate-execution-on-the-main-thread-8555e701163b) 601 | * [Cancelling Kotlin Coroutines](https://proandroiddev.com/cancelling-kotlin-coroutines-1030f03bf168) 602 | * [How to make sense of Kotlin coroutines](https://proandroiddev.com/how-to-make-sense-of-kotlin-coroutines-b666c7151b93) 603 | * [Kotlin Coroutines @ Vimeo](https://medium.com/vimeo-engineering-blog/kotlin-coroutines-vimeo-a-case-study-part-1-555e78aee8b9) 604 | * [Kotlin Coroutines patterns & anti-patterns](https://proandroiddev.com/kotlin-coroutines-patterns-anti-patterns-f9d12984c68e) 605 | * [Managing exceptions in nested coroutine scopes](https://proandroiddev.com/managing-exceptions-in-nested-coroutine-scopes-9f23fd85e61) 606 | * [Kotlin Coroutines on Android: Things I Wish I Knew at the Beginning](https://medium.com/capital-one-tech/kotlin-coroutines-on-android-things-i-wish-i-knew-at-the-beginning-c2f0b1f16cff) 607 | * [[Youtube] Structured concurrency](https://www.youtube.com/watch?v=Mj5P47F6nJg) 608 | * [Preventing coroutine cancellation for important actions](https://craigrussell.io/2020/03/preventing-coroutine-cancellation-for-important-actions/) 609 | * [Shared mutable state with Coroutines](https://medium.com/@nazarivanchuk/shared-mutable-state-with-coroutines-33a85e903466) 610 | * [Suspending over Views — Example](https://medium.com/androiddevelopers/suspending-over-views-example-260ce3dc9100) 611 | * [The suspend modifier — Under the hood](https://medium.com/androiddevelopers/the-suspend-modifier-under-the-hood-b7ce46af624f) 612 | * [Coroutines and exceptions: things to know](https://www.rockandnull.com/coroutines-and-exceptions/) 613 | * [Comparing Kotlin Coroutines with Callbacks and RxJava](https://www.lukaslechner.com/comparing-kotlin-coroutines-with-callbacks-and-rxjava/) 614 | * [Understanding Kotlin Coroutines with this mental model](https://www.lukaslechner.com/understanding-kotlin-coroutines-with-this-mental-model/) 615 | * [Cancellation in coroutines](https://medium.com/androiddevelopers/cancellation-in-coroutines-aa6b90163629) 616 | * [Demystifying CoroutineContext](https://proandroiddev.com/demystifying-coroutinecontext-1ce5b68407ad) 617 | * [Exceptions in coroutines](https://medium.com/androiddevelopers/exceptions-in-coroutines-ce8da1ec060c) 618 | * [Coroutines & Patterns for work that shouldn’t be cancelled](https://medium.com/androiddevelopers/coroutines-patterns-for-work-that-shouldnt-be-cancelled-e26c40f142ad) 619 | * [Why exception handling with Kotlin Coroutines is so hard and how to successfully master it!](https://www.lukaslechner.com/why-exception-handling-with-kotlin-coroutines-is-so-hard-and-how-to-successfully-master-it/) 620 | * [Advanced Kotlin Coroutines tips and tricks](https://alexsaveau.dev/blog/kotlin/android/advanced-kotlin-coroutines-tips-and-tricks) 621 | * [Kotlin Coroutines in Android Summary](https://medium.com/swlh/kotlin-coroutines-in-android-summary-1ed3048f11c3) 622 | * [Network Fetch with Kotlin Coroutine](https://medium.com/mobile-app-development-publication/network-fetch-with-kotlin-coroutine-3eee5593da1b) 623 | * [Kotlin Coroutine Scope, Context, and Job made simple](https://medium.com/mobile-app-development-publication/kotlin-coroutine-scope-context-and-job-made-simple-5adf89fcfe94) 624 | * [Best practices for coroutines in Android](https://developer.android.com/kotlin/coroutines/coroutines-best-practices) 625 | * [7 common mistakes you might be making when using Kotlin Coroutines](https://www.lukaslechner.com/7-common-mistakes-you-might-be-making-when-using-kotlin-coroutines/) 626 | * [7 Gotchas When Explore Kotlin Coroutine](https://medium.com/mobile-app-development-publication/7-gotchas-when-explore-kotlin-coroutine-64b78f005150) 627 | * [Do I need to call suspend functions of Retrofit and Room on a background thread?](https://www.lukaslechner.com/do-i-need-to-call-suspend-functions-of-retrofit-and-room-on-a-background-thread/) 628 | * [Use suspendCoroutine to connect callbacks and coroutines](https://le0nidas.gr/2021/03/28/use-suspendcoroutine-to-connect-callbacks-and-coroutines/) 629 | * [Coroutine suspend function: when does it start, suspend or terminate?](https://medium.com/mobile-app-development-publication/coroutine-suspend-function-when-does-it-start-suspend-or-terminate-2762cabac54e) 630 | * [Misnomers, Mistakes and Misunderstandings to watch for when learning Kotlin Coroutines and Flow](https://medium.com/google-developer-experts/misnomers-mistakes-and-misunderstandings-to-watch-for-when-learning-kotlin-coroutines-and-flow-2744186be3e) 631 | * [Are You Handling Exceptions in Kotlin Coroutines Properly?](https://www.netguru.com/blog/exceptions-in-kotlin-coroutines) 632 | * [Why using Kotlin Coroutines?](https://kt.academy/article/cc-why) 633 | * [Kotlin coroutines, threads, concurrency and parallelism 101](https://medium.com/android-news/kotlin-coroutines-threads-concurrency-and-parallelism-101-78a56e09d373) 634 | * [Job and children awaiting in Kotlin Coroutines](https://kt.academy/article/cc-job) 635 | * [Channel in Kotlin Coroutines](https://kt.academy/article/cc-channel) 636 | * [Coroutines racing! Why, and how](https://blog.louiscad.com/coroutines-racing-why-and-how) 637 | * [Safe delay in Android Views: goodbye Handlers, Hello Coroutines!](https://juliensalvi.medium.com/safe-delay-in-android-views-goodbye-handlers-hello-coroutines-cd47f53f0fbf) 638 | * [Coroutine Misconceptions: Whose Context Is It Anyway?](https://medium.com/livefront/coroutine-misconceptions-whose-context-is-it-anyway-320c0b7adcc7) 639 | * [Leveraging the Semaphore concept in Coroutines to limit the parallelism](https://blog.shreyaspatil.dev/leveraging-the-semaphore-concept-in-coroutines-to-limit-the-parallelism) 640 | * [Awaiting Multiple Coroutines the Clean Way](https://proandroiddev.com/awaiting-multiple-coroutines-the-clean-way-75469f8df160) 641 | * [Understand Android Lifecycle Aware Coroutine Scope Made Easy](https://medium.com/mobile-app-development-publication/understand-android-lifecycle-aware-coroutine-scope-made-easy-f86d13d16f0e) 642 | * [Slowing down your code with Coroutines](https://kt.academy/article/slowing-down-coroutines) 643 | * [A Perception of Exception in Kotlin Coroutines](https://betterprogramming.pub/a-perception-of-exception-in-kotlin-coroutines-d0b87131510f) 644 | * [Callback to Coroutines in Kotlin](https://amitshekhar.me/blog/callback-to-coroutines-in-kotlin) 645 | * [The Truth About Kotlin’s Non-Cancellable Coroutine Context](https://betterprogramming.pub/when-naming-matters-more-than-functionality-bc3dc2a8d576) 646 | * Functional Programming 647 | * [Function references in Kotlin](https://antonioleiva.com/function-references-kotlin/) 648 | * [Listeners with several functions in Kotlin](https://antonioleiva.com/listeners-several-functions-kotlin/) 649 | * [the tldr; on Kotlin’s let, apply, also, with and run functions](https://proandroiddev.com/the-tldr-on-kotlins-let-apply-also-with-and-run-functions-6253f06d152b) 650 | * [Kotlin Functional Programming: Does it make sense?](https://jorgecastillo.dev/kotlin-fp-does-it-make-sense) 651 | * [Lambda Expressions in Kotlin](http://www.baeldung.com/kotlin-lambda-expressions) 652 | * [Kotlin Standard Functions cheat-sheet](https://medium.com/androiddevelopers/kotlin-standard-functions-cheat-sheet-27f032dd4326) 653 | * [Kotlin: Function References](https://blog.stylingandroid.com/kotlin-function-references/) 654 | * [When to use Kotlin's standard functions](https://blog.danlew.net/2019/02/12/when-to-use-kotlins-stdlib-functions/) 655 | * [Be Explicit! Don’t Let Convenience Make Your Code Less Maintainable and Readable](https://medium.com/@nohitme/be-explicit-dont-let-convenience-make-your-code-less-maintainable-and-readable-8ea1f4a8e511) 656 | * [How to use Kotlin's 'it also let apply run'](https://bloggie.io/@_junrong/how-to-use-kotlin-s-it-also-let-apply-run) 657 | * [Noisy Code With Kotlin Scopes](https://proandroiddev.com/noisy-code-with-kotlin-scopes-331c632739de) 658 | * [Functional Domain Modeling in Kotlin](https://www.47deg.com/blog/functional-domain-modeling/#functional-domain-modeling-in-kotlin-0) 659 | * Extension Functions 660 | * [How to Abuse Kotlin Extension Functions](https://www.philosophicalhacker.com/post/how-to-abuse-kotlin-extension-functions/) 661 | * [Extensions: The Good, The Bad and The Ugly](https://proandroiddev.com/kotlin-pearls-6-extensions-the-good-the-bad-and-the-ugly-23c88fcab235) 662 | * [Writing clean models using extensions](https://okkotlin.com/clean-models/) 663 | * [Factory or Extension Function?](https://publicobject.com/2019/05/22/factory-or-extension-function/) 664 | * [Bad Kotlin Extensions](https://krossovochkin.com/posts/2021_01_25_bad_kotlin_extensions/) 665 | * [Effective extension function refactoring in Kotlin: companion object use case](https://medium.com/bumble-tech/effective-extension-function-refactoring-in-kotlin-companion-object-use-case-7c9a402b3d02) 666 | * Patterns 667 | * [Gang of Four Patterns in Kotlin](https://dev.to/lovis/gang-of-four-patterns-in-kotlin) 668 | * [Kotlin tips: Singleton, Utility Functions, group Object Initialization](https://medium.com/default-to-open/kotlin-tips-singleton-utility-functions-group-object-initialization-and-more-27cdd6f63a41) 669 | * [DI for lazy kotliniers](https://jankotlin.wordpress.com/2017/09/18/di-for-lazy-kotliniers/) 670 | * [Default implementations for interfaces](https://medium.com/a-problem-like-maria/default-implementations-for-interfaces-afd0b9316a8a) 671 | * [Abstract class vs interface in Kotlin](https://blog.kotlin-academy.com/abstract-class-vs-interface-in-kotlin-5ab8697c3a14) 672 | * [Patterns in Kotlin: Abstract Factory](https://medium.com/@dbottillo/patterns-in-kotlin-abstract-factory-a0ff99a0d177) 673 | * Variable 674 | * [A few facts about Companion objects](https://blog.kotlin-academy.com/a-few-facts-about-companion-objects-37e18429b725) 675 | * [You don't need a variable for this](https://forcelain.github.io/2017/08/04/you-don-t-need-a-variable-for-this.html) 676 | * [A practical explanation for initialization modifiers in Kotlin](https://medium.com/google-developer-experts/a-practical-explanation-for-initialization-modifiers-in-kotlin-9f52096ff1ca) 677 | * [Kotlin variable, to be Lazy, or to be Late?](https://medium.com/@elye.project/kotlin-variable-to-be-lazy-or-to-be-late-ab865c682d61) 678 | * Sequences 679 | * [Kotlin : Slow List and Lazy Sequence](https://medium.com/@elye.project/kotlin-slow-list-and-lazy-sequence-61691fc974c5) 680 | * [Kotlin Sequences: An Illustrated Guide](https://typealias.com/guides/kotlin-sequences-illustrated-guide/) 681 | * [Collections and sequences in Kotlin](https://medium.com/androiddevelopers/collections-and-sequences-in-kotlin-55db18283aca) 682 | * [Effective Kotlin: Use Sequence for bigger collections with more than one processing step](https://blog.kotlin-academy.com/effective-kotlin-use-sequence-for-bigger-collections-with-more-than-one-processing-step-649a15bb4bf) 683 | * [When to Use Sequences](https://typealias.com/guides/when-to-use-sequences/) 684 | * Flow 685 | * [Into the Flow: Kotlin cold streams primer](https://www.rockandnull.com/kotlin-flow/) 686 | * [Playing with Kotlin Flows](https://medium.com/@davidecerbo/playing-with-kotlin-flows-72370fc00e51) 687 | * [Back-pressure in Kotlin Flows](https://medium.com/@davidecerbo/backpressure-in-kotlin-flows-9324d86c964e) 688 | * [Going deep on Flows & Channels — Part 1: Streams](https://proandroiddev.com/going-deep-on-flows-channels-part-1-streams-5ae8b8491ac4) 689 | * [The Best Way to Collect a Flow in Kotlin – launchIn](https://luukgruijs.medium.com/understanding-hot-vs-cold-observables-62d04cf92e03) 690 | * [A safer way to collect flows from Android UIs](https://medium.com/androiddevelopers/a-safer-way-to-collect-flows-from-android-uis-23080b1f8bda) 691 | * [Kotlin Flows ~ an Android cheat sheet](https://rvbsoftdev.medium.com/kotlin-flows-an-android-cheat-sheet-d71ae772030d) 692 | * [Avoid launchIn](https://www.billjings.com/posts/title/avoid-launchin/) 693 | * [MutableSharedFlow is kind of complicated](https://itnext.io/mutablesharedflow-is-kind-of-complicated-61af68011eae) 694 | * [Backpressure in your Kotlin Flows](https://medium.com/google-developer-experts/backpressure-in-your-kotlin-flows-3eec980869c7) 695 | * [Kotlin flow: Nesting vs Chaining](https://krossovochkin.com/posts/2021_07_08_kotlin_flow_nesting_vs_chaining/) 696 | * [Simplifying APIs with coroutines and Flow](https://medium.com/androiddevelopers/simplifying-apis-with-coroutines-and-flow-a6fb65338765) 697 | * [StateFlow and SharedFlow: the new hot stream APIs in town](https://www.rockandnull.com/stateflow-kotlin/) 698 | * [Substituting Android’s LiveData: StateFlow or SharedFlow?](https://proandroiddev.com/should-we-choose-kotlins-stateflow-or-sharedflow-to-substitute-for-android-s-livedata-2d69f2bd6fa5) 699 | * [Migrating from LiveData to Kotlin’s Flow](https://medium.com/androiddevelopers/migrating-from-livedata-to-kotlins-flow-379292f419fb) 700 | * [Making cold Flows lifecycle-aware](https://dev.to/hichamboushaba/making-callback-flows-lifecycle-aware-2dai) 701 | * [Kotlin’s Flow in ViewModels: it’s complicated](https://bladecoder.medium.com/kotlins-flow-in-viewmodels-it-s-complicated-556b472e281a) 702 | * [Do or do not; there is no tryEmit()](https://blog.danlew.net/2021/03/23/do-or-do-not-there-is-no-tryemit/) 703 | * [Kotlin SharedFlow or: How I learned to stop using RxJava and love the Flow](https://proandroiddev.com/kotlin-sharedflow-or-how-i-learned-to-stop-using-rxjava-and-love-the-flow-e1b59d211715) 704 | * [repeatOnLifecycle API design story](https://medium.com/androiddevelopers/repeatonlifecycle-api-design-story-8670d1a7d333) 705 | * [Safely collecting hot flows from Android native UI](https://chao2zhang.medium.com/safely-collecting-hot-flows-from-android-native-ui-f22f645edb44) 706 | * [Explore LiveData & StateFlow Value Emitting Behavior](https://medium.com/mobile-app-development-publication/explore-livedata-stateflow-value-emitting-behavior-3f5c9e8ef2e3) 707 | * [Retry Operator in Kotlin Flow](https://amitshekhar.me/blog/retry-operator-in-kotlin-flow) 708 | * [StateFlow and SharedFlow in ViewModels](https://www.valueof.io/blog/stateflow-sharedflow-flow-viewmodel-lifecycle) 709 | * [callbackFlow - Callback to Flow API in Kotlin](https://amitshekhar.me/blog/callback-to-flow-api-in-kotlin) 710 | * [State production with unidirectional data flow and Kotlin Flows](https://tunjid.github.io/Mutator/) 711 | * [Kotlin Flows Animated](https://medium.com/@robert.baricevicpetrus/kotlin-flows-animated-55640aa48ac9) 712 | * [Understanding State Maintenance with MutableStateFlow](https://medium.com/@hunterfreas/understanding-state-maintenance-with-mutablestateflow-a40509693b00) 713 | * [How to properly collect Flows on Android?](https://medium.com/@ElianFabian/how-to-properly-collect-flows-on-android-ee7b948d9389) 714 | * Other 715 | * [Using Kotlin in a Java project: 10 lessons learned](https://xebia.com/using-kotlin-in-a-java-project-10-lessons-learned/) 716 | * [How to remove all !! from your Kotlin code](https://android.jlelse.eu/how-to-remove-all-from-your-kotlin-code-87dc2c9767fb) 717 | * [Learning Kotlin by Mistake](https://engineering.udacity.com/learning-kotlin-by-mistake-b99304b7d724) 718 | * [Simplified code with kotlin](https://android.jlelse.eu/simplified-code-with-kotlin-cda9915c9fb9) 719 | * [Safe, concise text parsing with regex destructuring in Kotlin](https://medium.com/@garnop/safe-concise-text-parsing-with-regex-destructuring-in-kotlin-b8f77ef1e30c) 720 | * [A life without ifs](https://medium.com/a-problem-like-maria/a-life-without-ifs-e44967e5c77b) 721 | * [Kotlin + Dagger 2 Gotchas](https://medium.com/@vlazzle/kotlin-dagger-2-gotchas-ebb6bb2ac506) 722 | * [Demystifying the inline keyword](https://handstandsam.com/2021/02/19/the-best-way-to-collect-a-flow-in-kotlin-launchin/) 723 | * [Looping in Kotlin](https://medium.com/@elye.project/looping-in-kotlin-65b54d05ad21) 724 | * [[Youtube] Kotlin in Production](https://www.youtube.com/watch?v=mDpnc45WwlI) 725 | * [What is “concurrent” access to mutable state?](https://proandroiddev.com/what-is-concurrent-access-to-mutable-state-f386e5cb8292) 726 | * [API Design — Handling exceptions](https://medium.com/@ZakTaccardi/api-design-handling-exceptions-84a143e32232) 727 | * [Moving forward with Kotlin: Inheritance](https://proandroiddev.com/moving-forward-with-kotlin-part-2-inheritance-64bc674e2224) 728 | * [What you didn’t know about arrays in Kotlin](https://medium.com/asos-techblog/what-you-didnt-know-about-arrays-in-kotlin-d3b20337e4) 729 | * [Kotlin: For-loop vs ForEach](https://medium.com/@elye.project/kotlin-for-loop-vs-foreach-7eb594960333) 730 | * [The Argument Over Kotlin Synthetics](https://proandroiddev.com/the-argument-over-kotlin-synthetics-735305dd4ed0) 731 | * [Kotlin : When if-else is too mainstream](https://medium.com/@ragdroid/kotlin-when-if-else-is-too-mainstream-acc4b91c2416) 732 | * [[Youtube] Advanced Kotlin](https://www.youtube.com/watch?v=UveNpy7lZ8M) 733 | * [Those sneaky Kotlin Exceptions](https://medium.com/google-developer-experts/those-sneaky-kotlin-exceptions-597c93d29358) 734 | * [Kotlin pearls: It’s an Object… It’s a Function… It’s an Invokable](https://proandroiddev.com/kotlin-pearls-3-its-an-object-it-s-a-function-it-s-an-invokable-bc4bfed2e63f) 735 | * [Kotlin: Don’t just use LET for null check](https://medium.com/@elye.project/kotlin-dont-just-use-let-7e91f544e27f) 736 | * [The Mystery of Mutable Kotlin Collections](https://proandroiddev.com/the-mystery-of-mutable-kotlin-collections-e82cbf5d781) 737 | * [Java vs. Kotlin: Performance](https://medium.com/@bards95/comparative-evaluation-of-selected-constructs-in-java-and-kotlin-part-1-dynamic-metrics-2592820ce80) 738 | * [[Kotlin Pearls 7] Unit, Nothing, Any (and null)](https://proandroiddev.com/kotlin-pearls-7-unit-nothing-any-and-null-cbbbbca86c2d) 739 | * [JvmDefault: More Useful Than You Think](https://www.zacsweers.dev/jvmdefault-more-useful/) 740 | * [Kotlin Enum Recipes](https://arturdryomov.dev/posts/kotlin-enum-recipes/) 741 | * [To val, or to const val, that is the question](https://medium.com/@patxi/to-val-or-to-const-val-that-is-the-question-43ba428332cb) 742 | * [Synchronization, Thread-Safety and Locking Techniques in Java and Kotlin](https://proandroiddev.com/synchronization-and-thread-safety-techniques-in-java-and-kotlin-f63506370e6d) 743 | * [Public API challenges in Kotlin](https://jakewharton.com/public-api-challenges-in-kotlin/) 744 | * [Kotlin’s Assert Is Not Like Java’s Assert](https://publicobject.com/2019/11/18/kotlins-assert-is-not-like-javas-assert/) 745 | * [Companion object invoke operator overloading for default constructor argument in generic classes](https://proandroiddev.com/companion-object-invoke-operator-overloading-for-default-constructor-argument-in-generic-classes-c8eb61dcc4f7) 746 | * [Uniform list access with subscripts](https://okkotlin.com/subscripts/) 747 | * [Kotlin’s vararg and spread operator](https://proandroiddev.com/kotlins-vararg-and-spread-operator-4200c07d65e1) 748 | * [Equality in Kotlin (==, === and equals)](https://medium.com/@agrawalsuneet/equality-in-kotlin-and-equals-d8373ef529f1) 749 | * [TypeCheck (‘is’) and Cast (‘as’) in Kotlin](https://medium.com/@agrawalsuneet/typecheck-is-and-cast-as-in-kotlin-a2490c567a85) 750 | * [Kotlin ‘For’ loop](https://medium.com/@agrawalsuneet/kotlin-for-loop-44056d4f7c21) 751 | * [[Youtube] Kotlin on Code Quality Tools](https://www.youtube.com/watch?v=MPjLd_M_fag) 752 | * [inline, noinline, crossinline — What do they mean?](https://android.jlelse.eu/inline-noinline-crossinline-what-do-they-mean-b13f48e113c2) 753 | * [Qualified ‘this’ in Kotlin](https://medium.com/@agrawalsuneet/qualified-this-in-kotlin-b8c7360b4fda) 754 | * [Why Kotlin’s Elvis Operator is Better Than Swift’s Guard Statement](https://medium.com/better-programming/kotlins-elvis-better-than-swift-s-guard-53030d403c3f) 755 | * [The hidden Kotlin gem you didn't think you'll love: Deprecations with ReplaceWith](https://dev.to/mreichelt/the-hidden-kotlin-gem-you-didn-t-think-you-ll-love-deprecations-with-replacewith-3blo) 756 | * [Kotlin and Exceptions](https://medium.com/@elizarov/kotlin-and-exceptions-8062f589d07) 757 | * [Reification of the Erased](https://medium.com/androiddevelopers/reification-of-the-erased-41e246725d2c) 758 | * [Kotlin’s Noinline & Crossline, once for all](https://medium.com/@cortinico/kotlins-noinline-crossline-once-for-all-c942fd07b7a3) 759 | * [Kotlin Functional Interfaces: Function reference and SAM conversion](https://krossovochkin.github.io/posts/2020_10_17_kotlin_functional_interfaces_function_references_and_sam_conversion/) 760 | * [Enhanced Deprecation in Kotlin](https://todd.ginsberg.com/post/kotlin/deprecation/) 761 | * [An opinionated guide on how to make your Kotlin code fun to read and joy to work with](https://proandroiddev.com/an-opinionated-guide-on-how-to-make-your-kotlin-code-fun-to-read-and-joy-to-work-with-caa3a4036f9e) 762 | * [Bridging the gap between coroutines, threads, and concurrency problems](https://medium.com/androiddevelopers/bridging-the-gap-between-coroutines-jvm-threads-and-concurrency-problems-864e563bd7c) 763 | * [Express Yourself: An Argument for Ending the Single Letter Generic Type Convention in Kotlin](https://bignerdranch.com/blog/express-yourself-an-argument-for-ending-the-single-letter-generic-type-convention-in-kotlin/) 764 | * [An in-depth look at Kotlin’s initializers](https://medium.com/keepsafe-engineering/an-in-depth-look-at-kotlins-initializers-a0420fcbf546) 765 | * [The Kotlin modifier that shouldn't be there](https://proandroiddev.com/the-modifier-that-shouldnt-be-there-77ff941f0529) 766 | * [How to return 2+ values with 0 allocation in Kotlin](https://blog.louiscad.com/how-to-return-2-values-with-0-allocation-in-kotlin) 767 | * [Avoid unnecessary object creation](https://kt.academy/article/ek-unnecessary-objects) 768 | * [Use inline modifier for functions with parameters of functional types](https://kt.academy/article/ek-inline-functions) 769 | * [Consider using inline value classes](https://kt.academy/article/ek-value-classes) 770 | * [How to leverage functional programming in Kotlin to write better, cleaner code](https://doordash.engineering/2022/03/22/how-to-leverage-functional-programming-in-kotlin-to-write-better-cleaner-code/) 771 | * [Raising code quality for Faire’s Kotlin codebase](https://craft.faire.com/raising-code-quality-for-faires-kotlin-codebase-f61420b3e5e6) 772 | * [Exploring Kotlin initialization with Android custom views](https://medium.com/google-developer-experts/exploring-kotlin-initialization-with-android-custom-views-cde06e915e8d) 773 | * [Values, not Enums](https://medium.com/@ReneeVandervelde/values-not-enums-1223f85c7f7) 774 | * [Using the Kotlin standard library from Java](https://medium.com/google-developer-experts/using-the-kotlin-standard-library-in-java-ea0766deac10) 775 | * [Mastering Enums in Kotlin: A Guide to Simplify Your Code](https://towardsdev.com/mastering-enums-in-kotlin-a-guide-to-simplify-your-code-130b5934cb16) 776 | * [[Youtube] TOA: Migrating To `kotlin.Result`](https://www.youtube.com/watch?v=rjOABsFvOXY) 777 | * [Hide internal members of Kotlin Module from JVM](https://medium.com/scalereal/hide-internal-members-of-kotlin-module-from-jvm-c7730507fb17) 778 | * [Error Handling the Kotlin Way](https://blog.kotlin-academy.com/error-handling-the-kotlin-way-7e2fb31b1aff) 779 | * [Everything you want to know about Functional interfaces in Kotlin](https://proandroiddev.com/everything-you-want-to-know-about-functional-interfaces-in-kotlin-55f4ae7b64ec) 780 | * [Kotlin Error Handling: Try-Catch, RunCatching, and Custom Exceptions](https://medium.com/@itsuki.enjoy/kotlin-error-handling-try-catch-and-custom-exceptions-1fbd302273f0) 781 | * [Kotlin Tips and Tricks You May Not Know: #3 — Built-in Assertions](https://medium.com/@elenavanengelen/kotlin-tips-and-tricks-you-may-not-know-3-built-in-assertions-d26540ccb2e0) 782 | * [Kotlin trick: writing shared Enum utility code](https://whtwnd.com/p-y.wtf/entries/Kotlin%20trick%3A%20writing%20shared%20Enum%20utility%20code) 783 | * [Kotlin 2.1.0: Smarter `when` with Guard Conditions](https://tomsabel.com/kotlin-2-1-0-smarter-when-with-guard-conditions-4541160d67a0) 784 | * [Kotlin Tips and Tricks You May Not Know: #7 — Goodbye try-catch, Hello runCatching!](https://proandroiddev.com/kotlin-tips-and-tricks-you-may-not-know-7-goodbye-try-catch-hello-trycatching-7135cb382609) 785 | * [Kotlin Under the Hood: Exploring Objects, Companion Objects, and Annotations: @JvmStatic, @JvmField, @JvmOverloads](https://proandroiddev.com/kotlin-under-the-hood-exploring-objects-companion-objects-and-annotations-jvmstatic-71e1bf1128df) 786 | 787 | --- 788 | 789 | ## Java 790 | [back to top](#readme) 791 | * [Understanding how references work in android and java](https://medium.com/google-developer-experts/finally-understanding-how-references-work-in-android-and-java-26a0d9c92f83) 792 | * [On properly using volatile and synchronized](https://medium.com/google-developer-experts/on-properly-using-volatile-and-synchronized-702fc05faac2) 793 | * [Default methods + lambdas = less code](https://android.jlelse.eu/default-methods-lambdas-less-code-aa0e63d6c5d9) 794 | * [Try. Finally. If. Not. Null.](https://www.yegor256.com/2016/03/22/try-finally-if-not-null.html) 795 | * [Nine Steps of Learning by Refactoring](https://www.yegor256.com/2018/04/10/learning-by-refactoring.html) 796 | * [Java Annotations tutorial with examples](https://beginnersbook.com/2014/09/java-annotations/) 797 | * [Strict Control of Java Code Quality](https://www.yegor256.com/2014/08/13/strict-code-quality-control.html) 798 | * [Common Bad Programming practices](https://medium.com/mindorks/common-bad-programming-practices-7fb470ed74d2) 799 | * [Handling Nullability in Your Code](https://pspdfkit.com/blog/2019/handling-nullability-in-your-code/) 800 | * [Java Memory Model](http://tutorials.jenkov.com/java-concurrency/java-memory-model.html) 801 | * [We don’t need Java anymore – it belongs to a different era](https://medium.com/@jankammerath/we-dont-need-java-anymore-it-belongs-to-a-different-era-ccbc028beed9) 802 | 803 | --- 804 | 805 | # Software development 806 | 807 | ## OOP 808 | [back to top](#readme) 809 | * [Typical Mistakes in Java Code](https://www.yegor256.com/2014/04/27/typical-mistakes-in-java-code.html) 810 | * [Objects vs. Data Structures](https://hackernoon.com/objects-vs-data-structures-e380b962c1d2) 811 | * [OOP Alternative to Utility Classes](https://www.yegor256.com/2014/05/05/oop-alternative-to-utility-classes.html) 812 | * [Why null is Bad?](https://www.yegor256.com/2014/05/13/why-null-is-bad.html) 813 | * [Objects Should Be Immutable](https://www.yegor256.com/2014/06/09/objects-should-be-immutable.html) 814 | * [Solid Is OOP for Dummies](https://www.yegor256.com/2017/03/28/solid.html) 815 | * [Getters/Setters. Evil. Period.](https://www.yegor256.com/2014/09/16/getters-and-setters-are-evil.html) 816 | * [Seven Virtues of a Good Object](https://www.yegor256.com/2014/11/20/seven-virtues-of-good-object.html) 817 | * [How Immutability Helps](https://www.yegor256.com/2014/11/07/how-immutability-helps.html) 818 | * [How Does Inversion of Control Really Work?](https://www.yegor256.com/2017/05/10/inversion-of-control.html) 819 | * [Object Behavior Must Not Be Configurable](https://www.yegor256.com/2016/04/19/object-must-not-be-configurable.html) 820 | * [Why Many Return Statements Are a Bad Idea in OOP](https://www.yegor256.com/2015/08/18/multiple-return-statements-in-oop.html) 821 | * [There Can Be Only One Primary Constructor](https://www.yegor256.com/2015/05/28/one-primary-constructor.html) 822 | * [Immutable Objects Are Not Dumb](https://www.yegor256.com/2014/12/22/immutable-objects-not-dumb.html) 823 | * [Constructors Must Be Code-Free](https://www.yegor256.com/2015/05/07/ctors-must-be-code-free.html) 824 | * [Class Casting Is a Discriminating Anti-Pattern](https://www.yegor256.com/2015/04/02/class-casting-is-anti-pattern.html) 825 | * [Utility Classes Have Nothing to Do With Functional Programming](https://www.yegor256.com/2015/02/20/utility-classes-vs-functional-programming.html) 826 | * [What's Wrong With Object-Oriented Programming?](https://www.yegor256.com/2016/08/15/what-is-wrong-object-oriented-programming.html) 827 | * [If-Then-Else Is a Code Smell](https://www.yegor256.com/2016/08/10/if-then-else-code-smell.html) 828 | * [Inheritance Is a Procedural Technique for Code Reuse](https://www.yegor256.com/2016/09/13/inheritance-is-procedural.html) 829 | * [Gradients of Immutability](https://www.yegor256.com/2016/09/07/gradients-of-immutability.html) 830 | * [Each Private Static Method Is a Candidate for a New Class](https://www.yegor256.com/2017/02/07/private-method-is-new-class.html) 831 | * [Inheritance, composition, delegation, and traits](https://blog.kotlin-academy.com/inheritance-composition-delegation-and-traits-b11c64f11b27) 832 | * [Builders and Manipulators](https://www.yegor256.com/2018/08/22/builders-and-manipulators.html) 833 | * [Operator new() is Toxic](https://www.yegor256.com/2018/01/02/operator-new-is-toxic.html) 834 | * [The Perils of Inheritance](https://blog.kotlin-academy.com/the-perils-of-inheritance-698b777fa773) 835 | * [How Data Visibility Hurts Maintainability](https://www.yegor256.com/2019/03/12/data-and-maintainability.html) 836 | * [Constructors or Static Factory Methods?](https://www.yegor256.com/2017/11/14/static-factory-methods.html) 837 | * [Streams vs. Decorators](https://www.yegor256.com/2017/10/10/streams-vs-decorators.html) 838 | * [[Yotube] What's Wrong About Utility Classes?](https://www.youtube.com/watch?v=psrp3TtaYYI) 839 | * [[Yotube] Dependency Injection Container is a Bad Idea](https://www.youtube.com/watch?v=oV6Utb5Jows) 840 | * [[Yotube] Immutable Objects vs. Common Sense](https://www.youtube.com/watch?v=KwP7Ay9Z-hc) 841 | * [[Yotube] A Few Thoughts About Constructors in OOP](https://www.youtube.com/watch?v=9yjtsCK6Wdk) 842 | * [[Yotube] Smart Classes and Functionality-Poor Interfaces](https://www.youtube.com/watch?v=Xk9tIqwca3k) 843 | * [[Yotube] How Immutability Helps in OOP](https://www.youtube.com/watch?v=EnhRgXrHCC4) 844 | * [Date/Time Printing Can Be Elegant Too](https://www.yegor256.com/2019/09/27/parsing-and-printing.html) 845 | * [[Yotube] The Alternative to Fluent Interfaces in Java](https://www.youtube.com/watch?v=REj8pJesMVI) 846 | * [A Dependency Injector’s 3 Jobs](https://publicobject.com/2019/06/25/a-dependency-injectors-3-jobs/) 847 | * [[Yotube] Why Static Methods Are Evil?](https://www.youtube.com/watch?v=A-9FjaOIsw8) 848 | * [Fat vs. Skinny Design](https://www.yegor256.com/2020/02/19/fat-skinny-design.html) 849 | * [[Yotube] Naked Data in OOP](https://www.youtube.com/watch?v=Nm274dGikFc) 850 | * [The forgotten art of construction](https://proandroiddev.com/the-forgotten-art-of-construction-cfedc368e67f) 851 | * [[Yotube] How to Inject Less?](https://www.youtube.com/watch?v=MNxG1xcA2uA) 852 | * [Prestructors](https://www.yegor256.com/2021/08/04/prestructors.html) 853 | * [Distance of coupling](https://www.yegor256.com/2020/10/27/distance-of-coupling.html) 854 | * [Compile less with SOLID](https://proandroiddev.com/compile-less-with-solid-bd0633c1f84) 855 | * [SOLID Principles Sketches](https://itnext.io/solid-principles-sketches-a38865e771f0) 856 | * [Smaller Try-Blocks Are Better](https://www.yegor256.com/2022/09/08/smaller-try-blocks.html) 857 | * [[Youtube] Making Impossible States Impossible](https://www.youtube.com/watch?v=IcgmSRJHu_8) 858 | * [👨‍💻Kotlin SOLID Principles](https://medium.com/huawei-developers/kotlin-solid-principles-tutorial-examples-192bf8c049dd) 859 | * [Liskov Substitution Principle (basics)](https://levelup.gitconnected.com/liskov-substitution-principle-basics-46937550479f) 860 | 861 | --- 862 | 863 | ## Patterns 864 | [back to top](#readme) 865 | * [The Evolution Of The Repository Pattern - Be Aware Of Over Abstraction](http://hannesdorfmann.com/android/evolution-of-the-repository-pattern) 866 | * [Common Design Patterns for Android](https://www.raywenderlich.com/109843/common-design-patterns-for-android) 867 | * [Writing Better Adapters](https://proandroiddev.com/writing-better-adapters-1b09758407d2) 868 | * [Dont use DAO, use Repository](https://thinkinginobjects.com/2012/08/26/dont-use-dao-use-repository/) 869 | * [Design Patterns in Android – Observer](https://www.thedroidsonroids.com/blog/design-patterns-android-observer-2) 870 | * [Singletons The Safe Way](https://medium.com/@mattcarroll/singletons-the-safe-way-9d1e019220fc) 871 | * [Android Chain Gangs](https://medium.com/@mattcarroll/android-chain-gangs-f35419f5f3dd) 872 | * [Defensive Programming via Validating Decorators](https://www.yegor256.com/2016/01/26/defensive-programming.html) 873 | * [Vertical and Horizontal Decorating](https://www.yegor256.com/2015/10/01/vertical-horizontal-decorating.html) 874 | * [Great Adpater Hell Escape](http://hannesdorfmann.com/android/adapter-delegates) 875 | * [Building vertical decorators right](https://www.vzurauskas.com/2018/10/28/building-vertical-decorators-right) 876 | * [Inversion of control containers and the dependency injection pattern](https://martinfowler.com/articles/injection.html) 877 | * [Service locator vs dependency injection](http://guy-murphy.github.io/2014/11/24/service-locator-vs-dependency-injection/) 878 | * [Composable Decorators vs. Imperative Utility Methods](https://www.yegor256.com/2015/02/26/composable-decorators.html) 879 | * [Bohemian Wrapsody](https://proandroiddev.com/bohemian-wrapsody-86a5ac3c910a) 880 | * [The Builder pattern in Java — yet another Builder Pattern article](https://medium.com/@sergio.igwt/the-builder-pattern-in-java-2c03fc6ccd16) 881 | * [[Youtube] Veil Objects to Replace DTOs](https://www.youtube.com/watch?v=nErn5G_JHhE) 882 | * [State Design Pattern](https://howtodoinjava.com/design-patterns/behavioral/state-design-pattern/) 883 | * [The Proxy Design Pattern in Java](https://stackabuse.com/the-proxy-design-pattern-in-java/) 884 | * [Iterator Pattern](https://www.geeksforgeeks.org/iterator-pattern/) 885 | * [Visitor design pattern](https://www.geeksforgeeks.org/visitor-design-pattern/) 886 | * [Facade Design Pattern](https://www.baeldung.com/java-facade-pattern) 887 | * [Common Design Patterns and App Architectures for Android](https://www.raywenderlich.com/18409174-common-design-patterns-and-app-architectures-for-android) 888 | * [Why service locator is so unpopular](https://proandroiddev.com/why-service-locator-is-so-unpopular-bbe8678be72c) 889 | * [Streamlining User Actions with the Command Pattern: A Practical Guide](https://proandroiddev.com/streamlining-user-actions-with-the-command-pattern-a-practical-guide-72e2064b4ce7) 890 | * [Dependency Injection vs. Service Locator](https://www.baeldung.com/cs/dependency-injection-vs-service-locator) 891 | * [Keep listening or do your job and finish](https://dev.to/altavir/keep-listening-or-do-your-job-and-finish-2hej) 892 | * [10 of the Best Anti-Patterns Ever](https://medium.com/software-design-concepts/10-of-the-best-anti-patterns-ever-dcbab89bc21d) 893 | 894 | --- 895 | 896 | ## Tests 897 | [back to top](#readme) 898 | * Main 899 | * [Should we use mocking libraries for go testing?](https://www.philosophicalhacker.com/2016/01/13/should-we-use-mocking-libraries-for-go-testing/) 900 | * [Clean tests: Naming](https://android.jlelse.eu/clean-tests-part-1-naming-cce94edf0522) 901 | * [Clean tests: Comments](https://android.jlelse.eu/clean-tests-part-2-comments-4016ee82f186) 902 | * [Testing state vs. testing interaction](https://medium.com/android-testing-daily/testing-state-vs-testing-interaction-c5d7fe0bf247) 903 | * [Test doubles](https://medium.com/android-testing-daily/test-doubles-9a63dfaeb28b) 904 | * [One weird trick to name your tests](https://medium.com/@anupcowkur/one-weird-trick-to-name-your-tests-28ca1f8131c2) 905 | * [An Introduction to Testing Custom Views on Android](https://proandroiddev.com/an-introduction-to-testing-custom-views-on-android-10a6152f379) 906 | * [Myths about Unit Tests](https://8thlight.com/blog/fabien-townsend/2017/09/19/myths-about-unit-tests.html) 907 | * [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/) 908 | * [What’s in a name?](https://medium.com/android-testing-daily/whats-in-a-name-b5f7531abf3b) 909 | * [Unit test vs. Integration test](https://medium.com/android-testing-daily/unit-test-vs-integration-tes-fba13b92fbf6) 910 | * [Code coverage](https://medium.com/android-testing-daily/code-coverage-dc1e3d0c70) 911 | * [Don’t be lazy, use @Rules](https://proandroiddev.com/dont-be-lazy-use-rules-95c68f4ecb8b) 912 | * [Mock factory for Android testing in multi-module system](https://treatwell.engineering/mock-factory-for-android-testing-in-multi-module-system-7654f45808be) 913 | * [Testing on Android using JUnit 5](https://proandroiddev.com/testing-on-android-using-junit-5-61b3d2cb3198) 914 | * [Parameterized tests with Kotlin’s Sealed Classes](https://proandroiddev.com/sealed-classes-with-parameterized-tests-in-junit5-cd62f2bf8b36) 915 | * [Testing Kotlin Lambda Invocations without Mocking](https://dev.to/ychescale9/testing-kotlin-lambda-invocations-without-mocking-3n32) 916 | * [Better Kotlin unit testing with mock helper functions](https://medium.com/@june.pravin/better-kotlin-unit-testing-with-mock-helper-functions-38dc1a6c4684) 917 | * [Replacing Mocks](https://ryanharter.com/blog/2020/06/replacing-mocks/) 918 | * [Unit Testing vs Functional Testing: A Detailed Comparison](https://www.simform.com/unit-testing-vs-functional-testing/) 919 | * [Code Coverage Best Practices](https://testing.googleblog.com/2020/08/code-coverage-best-practices.html) 920 | * [Anti-patterns of automated software testing](https://medium.com/swlh/anti-patterns-of-automated-software-testing-b396283a4cb6) 921 | * [Unit Tests and Concurrency](https://lordraydenmk.github.io/2021/unit-tests-and-concurrency/) 922 | * [Mocks, fakes and stubs: the stunt doubles of testing](https://blog.sebastiano.dev/test-doubles-mocks-stubs-fakes/) 923 | * [Unit Testing as a 1st-class Citizen](https://robholmes.app/posts/unit-testing-as-a-first-class-citizen/) 924 | * [Behavior Driven Development (BDD) and Functional Testing](https://medium.com/javascript-scene/behavior-driven-development-bdd-and-functional-testing-62084ad7f1f2) 925 | * [Guidelines for writing better tests](https://www.rockandnull.com/guidelines-for-writing-better-tests/) 926 | * [Should I test private methods directly?](https://medium.com/decathlontechnology/should-i-test-private-methods-direclty-c48f4fa7bb4d) 927 | * [Revamping the Android testing pipeline at Dropbox](https://dropbox.tech/mobile/revamping-the-android-testing-pipeline-at-dropbox) 928 | * [Testing Files without Files](https://arturdryomov.dev/posts/testing-files-without-files/) 929 | * [Negative Scenarios in Software Testing: Best Practices](https://infinum.com/blog/negative-scenarios-in-software-testing-best-practices/) 930 | * [Unit Testing Delays, Errors & Retries with Kotlin Flows](https://codingwithmohit.com/coroutines/unit-testing-delays-errors-retries-with-kotlin-flows/) 931 | * [Learning State & Shared Flows with Unit Tests](https://codingwithmohit.com/coroutines/learning-shared-and-state-flows-with-tests/) 932 | * [Confirmed: Code Coverage Is a Useless Management Metric](https://betterprogramming.pub/confirmed-code-coverage-is-a-useless-management-metric-35afa05e8549) 933 | * [Prefer Integration Tests Over Unit Tests](https://betterprogramming.pub/prefer-integration-tests-over-unit-tests-2079856f9cfc) 934 | * [Test My Code, Not My Limits](https://betterprogramming.pub/test-my-code-not-my-limits-b9d78b3056a9) 935 | * Android 936 | * [Fast and reliable UI tests on Android](https://labs.ribot.co.uk/fast-and-reliable-ui-tests-on-android-17c261b8220c#.1bilhu4hg) 937 | * [Espresso Test for Intent](http://pengj.me/android/test/2015/10/17/expresso-test-intent.html) 938 | * [How to be a mock star](https://medium.com/fueled-android/how-to-be-a-mock-star-fc00714d8c2f) 939 | * [Android testing: Unit testing (Part 1)](http://alexzh.com/tutorials/android-testing-unit-testing/) 940 | * [Android testing: Mockito and Robolectric (Part 2)](http://alexzh.com/tutorials/android-testing-mockito-robolectric/) 941 | * [Android testing: Espresso (Part 3)](http://alexzh.com/tutorials/android-testing-espresso-part-3/) 942 | * [Android testing: UI Automator (Part 4)](http://alexzh.com/tutorials/android-testing-ui-automator-part-4/) 943 | * [Dont Use Espresso Idling Resources like Google does](https://www.philosophicalhacker.com/post/psa-dont-use-esprsso-idling-resources-like-this/) 944 | * [Simple way to test asynchronous actions in Android](https://medium.com/@v.danylo/simple-way-to-test-asynchronous-actions-in-android-service-asynctask-thread-rxjava-etc-d43b0402e005) 945 | * [Dagger 2 Testing](http://endlesswhileloop.com/blog/2016/06/23/dagger-2-testing/) 946 | * [Why I Don't use Robolectric](https://www.philosophicalhacker.com/post/why-i-dont-use-roboletric/) 947 | * [Junit testing and Android dependencies](https://android.jlelse.eu/junit-testing-and-android-dependencies-e65e66afce61) 948 | * [Unit testing protected lifecycle methods](https://medium.com/google-developer-experts/unit-testing-activity-lifecycle-4e740f71e68a) 949 | * [Unit Testable RecyclerViews](https://www.philosophicalhacker.com/post/unit-testable-recycler-views/) 950 | * [The 3 tiers of the Android test pyramid](https://medium.com/android-testing-daily/the-3-tiers-of-the-android-test-pyramid-c1211b359acd) 951 | * [Testing Views in Isolation at RoMOBOS](https://proandroiddev.com/testing-views-in-isolation-at-romobos-d288e76fe10e) 952 | * [Espresso Test Addiction: An Anti-pattern](https://www.philosophicalhacker.com/post/espresso-test-addiction/) 953 | * [Don’t Keep Activities alone is not enough for testing!](https://medium.com/@elye.project/dont-keep-activities-alone-is-not-enough-for-testing-407b7c01bd60) 954 | * [Taming UI tests when using multiple Gradle flavors](https://medium.com/stepstone-tech/taming-ui-tests-when-using-multiple-gradle-flavors-6190b3692491) 955 | * [Subclass and override](https://medium.com/android-testing-daily/subclass-and-override-1492f0564b35) 956 | * [How To Unit Test LiveData and Lifecycle Components](https://proandroiddev.com/how-to-unit-test-livedata-and-lifecycle-components-8a0af41c90d9) 957 | * [Unit testing XML resources](https://medium.com/android-testing-daily/unit-testing-xml-resources-7387447f9ef7) 958 | * [Custom view attributes](https://medium.com/android-testing-daily/custom-view-attributes-ecf8822235a0) 959 | * [Can you fix the test?](https://jeroenmols.com/blog/2018/12/06/fixthetest/) 960 | * [Unit Testing in MVVM+Kotlin+DataBinding](https://medium.com/@nik.arora8059/unit-testing-in-mvvm-kotlin-databinding-ba3d4ea08f0e) 961 | * [Isolate your Fragments…just for testing](https://medium.com/@aitorvs/isolate-your-fragments-just-for-testing-ea7d4fddcba2) 962 | * [Unit-testing LiveData and other common observability problems](https://medium.com/androiddevelopers/unit-testing-livedata-and-other-common-observability-problems-bb477262eb04) 963 | * [Sharing code between local and instrumentation tests](https://proandroiddev.com/sharing-code-between-local-and-instrumentation-tests-c0b57ebd3200) 964 | * [Unit Testing RxJava or Coroutine Code With Constructor Injection](https://androidessence.com/unit-testing-async-code) 965 | * [Kotlin Unit Tests with Parameters](https://proandroiddev.com/kotlin-unit-tests-with-parameters-e37aab2b36f6) 966 | * [Testing Android Architecture Components](https://www.raywenderlich.com/12678525-testing-android-architecture-components) 967 | * [Android Model-View-Intent with Unit Tests](https://proandroiddev.com/android-model-view-intent-with-unit-tests-260e9a0cdd64) 968 | * [Unit testing on Android](https://proandroiddev.com/unit-testing-on-android-9c15632848c) 969 | * [Understanding Unit Tests for Android in 2021](https://proandroiddev.com/understanding-unit-tests-for-android-in-2021-71984f370240) 970 | * [Troubleshooting Mockito-Kotlin in Android Testing](https://hinchman-amanda.medium.com/troubleshooting-kotlin-mockito-in-android-testing-f5df66ae5cd5) 971 | * [How to mock under instrumentation test with MockK and Dexopener](https://proandroiddev.com/how-we-made-our-ui-tests-more-stable-with-mockk-and-dexopener-c78b02a86de) 972 | * [Unit Testing Kotlin Flow](https://medium.com/google-developer-experts/unit-testing-kotlin-flow-76ea5f4282c5) 973 | * [Unit Testing RxJava Observables](https://www.ericthecoder.com/2021/05/04/unit-testing-rxjava-observables/) 974 | * [Why I’m switching from Mockito to Mockk](https://www.ericthecoder.com/2021/07/20/why-im-switching-from-mockito-to-mockk/) 975 | * [Getting Started with Cucumber](https://www.raywenderlich.com/26211276-getting-started-with-cucumber) 976 | * [Testing Kotlin Coroutines](https://kt.academy/article/cc-testing) 977 | * [Mocking Matchers API](https://krossovochkin.com/posts/2021_09_11_mocking_matchers_api/) 978 | * [Android BDD with Robolectric and Espresso — how to refactor your Android project tests](https://medium.com/gumtree-dev-team/android-bdd-with-robolectric-and-espresso-how-to-refactor-your-android-project-tests-d79a07870da0) 979 | * [Unit testing with Mockk tweaks and tricks part1](https://dev.to/davidibrahim/unit-testing-with-mockk-tweaks-and-tricks-part1-2f6i) 980 | * [An effective testing strategy for Android](https://proandroiddev.com/an-effective-testing-strategy-for-android-i-4a269d134acf) 981 | * [WorkManager, Dagger and Testing](https://medium.com/@rotxed/workmanager-dagger-and-testing-bee7d244d1ac) 982 | * [Testing functions with lambdas using MockK](https://www.valueof.io/blog/testing-listener-lambda-mockk) 983 | * [The conflation problem of testing StateFlows](https://zsmb.co/conflating-stateflows/) 984 | * [[Youtube] Solution to Share Code Between Tests in Android! ](https://www.youtube.com/watch?v=kV1_Y-jzDNs) 985 | 986 | --- 987 | 988 | ## Git 989 | [back to top](#readme) 990 | * [Keep a readable Git history](https://fangpenlin.com/posts/2013/09/30/keep-a-readable-git-history/) 991 | * [Four Steps To Maintaining a Clean Git History](https://spin.atomicobject.com/2017/04/23/maintain-clean-git-history/) 992 | * [Android Studio and Git Branches – How to Simplify Your Work](https://www.thedroidsonroids.com/blog/android-studio-and-git-branches-how-to-simplify-you-work) 993 | * [Mastering Git — Why Rebase is amazing](https://hackernoon.com/mastering-git-why-rebase-is-amazing-a954485b128a) 994 | * [8 Productivity Tips for GitHub](https://dev.to/_darrenburns/8-productivity-tips-for-github-44kn) 995 | * [Git from humans to humans — Pull Requests](https://medium.com/@caueferreira/git-from-humans-to-humans-pull-requests-c25ad049a278) 996 | * [Merge Git Authors](https://arturdryomov.dev/posts/merge-git-authors/) 997 | * [Git, beyond version control](https://medium.com/@aitorvs/git-beyond-version-control-629cbea23f37) 998 | * [How to never commit a temporary code to your codebase](https://medium.com/@kazarovetsblr/how-to-never-commit-a-temporary-code-to-your-codebase-91004b45f32d) 999 | * [Android Kotlin Code Quality Check using Detekt and Git Hooks Pre-push](https://medium.com/binar-academy/android-kotlin-code-quality-check-using-detekt-and-git-hooks-pre-push-mac-and-linux-556c111bc71b) 1000 | * [[Youtube] Three-branches release model: Master-Candidate-Live](https://www.youtube.com/watch?v=G6-OKD58czQ) 1001 | * [How to Split Pull Requests – Good Practices, Methods and Git Strategies](https://www.thedroidsonroids.com/blog/splitting-pull-request) 1002 | * [Trello Android's Git Branching Strategy](https://blog.danlew.net/2020/11/11/trello-androids-git-branching-strategy/) 1003 | * [How to Pull Request](https://medium.com/google-developer-experts/how-to-pull-request-d75ac81449a5) 1004 | * [How to Prevent Git Commit Naming Mistakes](https://betterprogramming.pub/how-to-prevent-git-commit-naming-mistakes-a34c8a7c6ae6) 1005 | * [Git Rebase For Nested Branches](https://betterprogramming.pub/git-rebase-for-nested-branches-7a6bbb4a6688) 1006 | * [Anatomy of a .gitignore](https://blog.sebastiano.dev/anatomy-of-a-gitignore/) 1007 | * [Crafting the Perfect Pull Request](https://tutorialedge.net/tips/crafting-the-perfect-pull-request/) 1008 | 1009 | --- 1010 | 1011 | ## Work 1012 | [back to top](#readme) 1013 | * Main 1014 | * [Things You Should Never Do, Part I](http://www.joelonsoftware.com/articles/fog0000000069.html) 1015 | * [Perfect code is an illusion](https://8thlight.com/blog/daniel-irvine/2016/11/11/perfect-code-is-an-illusion.html) 1016 | * [The problematic pull request](https://8thlight.com/blog/daniel-irvine/2016/11/18/the-problematic-pull-request.html) 1017 | * [Flexibility Equates to Lower Quality](https://www.yegor256.com/2017/04/11/flexibility-equates-lower-quality.html) 1018 | * [Three Things I Expect From a Software Architect](https://www.yegor256.com/2015/05/11/software-architect-responsibilities.html) 1019 | * [Two Instruments of a Software Architect](https://www.yegor256.com/2015/05/13/two-instruments-of-software-architect.html) 1020 | * [The Churn](http://blog.cleancoder.com/uncle-bob/2016/07/27/TheChurn.html) 1021 | * [Keep Your Features in Progress Out of Your Release Builds](http://antoine-merle.com/blog/2015/10/10/keep-your-features-in-progress-out-of-your-release-builds/) 1022 | * [Who Is a Project Manager?](https://www.yegor256.com/2016/05/24/who-is-project-manager.html) 1023 | * [Either Bugs or Pull Requests ... or You Are Out](https://www.yegor256.com/2018/07/24/bugs-or-pull-requests.html) 1024 | * [The TDD That Works for Me](https://www.yegor256.com/2017/03/24/tdd-that-works.html) 1025 | * [Are You an Architect?](https://www.yegor256.com/2018/06/26/are-you-an-architect.html) 1026 | * [Don't Aim for Quality, Aim for Speed](https://www.yegor256.com/2018/03/06/speed-vs-quality.html) 1027 | * [Who is (not) a Tech Leader](https://medium.com/@froger_mcs/who-is-not-a-tech-leader-a98aab27ad93) 1028 | * [Are You a Coder or a Developer?](https://www.yegor256.com/2018/01/23/sociotech-skills.html) 1029 | * [The Formula for Software Quality](https://www.yegor256.com/2017/12/26/software-quality-formula.html) 1030 | * [Programmer’s discipline](https://medium.com/@ponnappa/programmers-discipline-57cc9ec89c91) 1031 | * [Five tips to get your code base in shape](https://jeroenmols.com/blog/2019/02/20/tacklelegacy/) 1032 | * [Achieving Your Goals Feels Good](https://www.donnfelker.com/achieving-your-goals-feels-good/) 1033 | * [Talk, then code](https://dave.cheney.net/2019/02/18/talk-then-code) 1034 | * [[Youtube] Daily Stand-Up Meetings Are Evil](https://www.youtube.com/watch?v=ibT5oKToMoQ) 1035 | * [[Youtube] Seven Sins of a Software Project](https://www.youtube.com/watch?v=ZtWmlKi3ivc) 1036 | * [The Big Rewrite](https://jvaneyck.wordpress.com/2015/03/12/the-big-rewrite/) 1037 | * [[Youtube] Protect yourself against stupid managers—become their good friend!](https://www.youtube.com/watch?v=_Y2lZsRLwlk) 1038 | * [Software Project Review Checklist](https://www.yegor256.com/2019/04/02/software-project-review-checklist.html) 1039 | * [Is High Quality Software Worth the Cost?](https://martinfowler.com/articles/is-quality-worth-cost.html) 1040 | * [Test Driven Development Is Dumb. Fight Me.](https://itnext.io/test-driven-development-is-dumb-fight-me-a38b3033280c) 1041 | * [[Youtube] How to Deal With Conflicts in a Software Team](https://www.youtube.com/watch?v=GWLpAZqvqSc) 1042 | * [[Youtube] Testing and Quality Assurance (QA) are two entirely different things!](https://www.youtube.com/watch?v=hp4PL0AJAVo) 1043 | * [Daily Stand-up Injection of Guilt](https://www.yegor256.com/2019/09/03/injection-of-guilt.html) 1044 | * [The Joy of Programming](https://www.yegor256.com/2019/07/30/joy-of-programming.html) 1045 | * [TDD Misbeliefs](https://www.yegor256.com/2019/07/02/tdd-misbeliefs.html) 1046 | * [Maybe Don't Write That Test](https://www.philosophicalhacker.com/post/maybe-dont-write-that-test/) 1047 | * [Stakeholder anti-patterns](https://medium.com/snapp-mobile/stakeholder-anti-patterns-b8a839a39a78) 1048 | * [The Problem You Solve Is More Important Than The Code You Write](https://levelup.gitconnected.com/the-problem-you-solve-is-more-important-than-the-code-you-write-d0e5493132c6) 1049 | * [How To Be a Bad Senior Developer](https://levelup.gitconnected.com/how-to-be-a-bad-senior-developer-f774567b5ef2) 1050 | * [How To Use Technical Debt In Your Favor](https://levelup.gitconnected.com/how-to-use-technical-debt-in-your-favor-98bae475ba68) 1051 | * [Why so salty? Context is everything in tech discussions.](https://medium.com/snapp-mobile/why-so-salty-context-is-everything-in-tech-discussions-705cfe866b46) 1052 | * [Revolutionary Evolution](https://www.yegor256.com/2019/11/05/revolutionary-evolution.html) 1053 | * [‘Must be willing to work under pressure’ is a warning sign](https://codewithoutrules.com/2018/12/03/work-under-pressure/) 1054 | * [“open floor space” is not a job benefit](https://codewithoutrules.com/2017/03/20/open-floor-plan/) 1055 | * [Only code at work? That doesn’t make you a worse programmer](https://codewithoutrules.com/2018/03/04/only-code-at-work/) 1056 | * [Setting boundaries at your job as a programmer](https://codewithoutrules.com/2019/04/03/setting-boundaries-at-work/) 1057 | * [A message without a context is unprofessional and very annoying for the listener; don't do it!](https://www.youtube.com/watch?v=fVMml2vpP-Y) 1058 | * [Talented Programmers, Who Are They?](https://www.yegor256.com/2019/12/31/talented-programmers.html) 1059 | * [Deadlines](https://publicobject.com/2019/01/12/software-deadlines/) 1060 | * [Don’t crank out code at 2AM, especially if you’re the CTO](https://codewithoutrules.com/2017/07/07/dont-code-at-2am/) 1061 | * [Rethinking "Always Be Coding"](https://www.rockandnull.com/rethinking-always-be-coding/) 1062 | * [Intentional qualities](https://medium.com/@elizarov/intentional-qualities-7e6a57bb87fc) 1063 | * [To Measure or Not to Measure](https://www.yegor256.com/2020/06/23/individual-performance-metrics.html) 1064 | * [[Youtube] Micro-management vs. micro-tasking](https://www.youtube.com/watch?v=uhDmHkMAYnM) 1065 | * [Being a senior software developer](https://levelup.gitconnected.com/being-a-senior-developer-380349b1c1dd) 1066 | * [Typical programmer’s mistakes](https://medium.com/@lsoares/common-programmers-errors-ea598b8f14c9) 1067 | * [How to suck at managing software projects](https://medium.com/@lsoares/how-to-suck-at-managing-software-projects-4e6e47007473) 1068 | * [How we scaled technical discussions in the Android team](https://medium.com/babylon-engineering/how-we-scaled-technical-discussions-in-the-android-team-f0e198f069b1) 1069 | * [Creating a documentation culture in the Android team](https://medium.com/babylon-engineering/creating-a-documentation-culture-in-the-android-team-7cd8e61e1eaf) 1070 | * [Bringing some order to Pull Request reviews](https://medium.com/babylon-engineering/bringing-some-order-to-pull-request-reviews-27ac55d181bb) 1071 | * [7 Steps to Technical Leadership](https://magdamiu.com/2020/09/12/7-steps-to-technical-leadership/) 1072 | * [The Pain of Daily Reports](https://www.yegor256.com/2020/11/03/daily-reports.html) 1073 | * [On code style and consistency](https://www.rockandnull.com/code-style/) 1074 | * [3 Inconvenient Truths About Coding](https://betterprogramming.pub/3-inconvenient-truths-about-coding-790ad872a026) 1075 | * [What & Why, Not How](https://handstandsam.com/2021/02/23/what-why-not-how/) 1076 | * [The 3 Mindsets to Avoid as a Senior Software Developer](https://betterprogramming.pub/the-3-mindsets-to-avoid-as-a-senior-software-developer-efc8fa17fc3) 1077 | * [Great teams merge fast](https://saket.me/great-teams-merge-fast/) 1078 | * [Perks for adult developers](https://s4nchez.medium.com/perks-for-adult-developers-9715ee260c1a) 1079 | * [4 Mistakes I Made as a Programmer, but I Had To Become a CTO To See Them](https://betterprogramming.pub/4-mistakes-i-made-as-a-programmer-but-i-had-to-become-a-cto-to-see-them-19a41ba70411) 1080 | * [How to deal with technical debt](https://medium.com/swlh/how-to-deal-with-technical-debt-8460eddc4aa1) 1081 | * [Why you need vision and strategy for your team](https://medium.com/@froger_mcs/why-you-need-vision-and-strategy-for-your-team-e59951436f04) 1082 | * [Tech leader self-assessment](https://medium.com/@froger_mcs/tech-lead-self-assessment-534de7842ebe) 1083 | * [Senior software engineer, these skills are expected from you](https://medium.com/@froger_mcs/senior-software-engineer-these-skills-are-expected-from-you-286c8a0334d0) 1084 | * [An incomplete list of skills senior engineers need, beyond coding](https://skamille.medium.com/an-incomplete-list-of-skills-senior-engineers-need-beyond-coding-8ed4a521b29f) 1085 | * [Building and Motivating Engineering Teams](https://medium.com/swlh/building-and-motivating-engineering-teams-24fd56910039) 1086 | * [Stop rewriting projects](https://proandroiddev.com/stop-rewriting-projects-3ce45b80862a) 1087 | * [How to Learn to Code](https://medium.com/javascript-scene/how-to-learn-to-code-9f5803506bac) 1088 | * [High-Performing Teams Need Psychological Safety. Here’s How to Create It](https://hbr.org/2017/08/high-performing-teams-need-psychological-safety-heres-how-to-create-it) 1089 | * [Why Development Teams are Slow](https://medium.com/javascript-scene/why-development-teams-are-slow-89107985c75c) 1090 | * [Engineering Productivity](https://skamille.medium.com/engineering-productivity-b1ea12db02e4) 1091 | * [Lack of Problem Is the Problem](https://www.yegor256.com/2020/10/13/lack-of-problem.html) 1092 | * [What is the Difference Between a Junior and a Senior Developer?](https://medium.com/javascript-scene/what-is-the-difference-between-a-junior-and-a-senior-developer-63c1594d7a98) 1093 | * [Learning a new codebase from its history beyond the code](https://s4nchez.medium.com/learning-a-new-codebase-from-its-history-beyond-the-code-64de2061592f) 1094 | * [The Pain of Daily Reports](https://www.yegor256.com/2020/11/03/daily-reports.html) 1095 | * [[Youtube] Technical leadership and glue work](https://www.youtube.com/watch?v=KClAPipnKqw) 1096 | * [Perfectionism vs. Excellence](https://hannesdorfmann.com/perfectionism-vs-excellence/) 1097 | * [10 Mistakes To Avoid as a Software Development Manager](https://betterprogramming.pub/10-mistakes-to-avoid-as-a-software-development-manager-84bdf645ed7c) 1098 | * [[Youtube] The Future of the Testing Role](https://www.youtube.com/watch?v=c5821YeWico) 1099 | * [Incident Review and Postmortem Best Practices](https://blog.pragmaticengineer.com/postmortem-best-practices/) 1100 | * [Building high-performing engineering team](https://medium.com/@froger_mcs/on-psychological-safety-9c9b6815c1cd) 1101 | * [[Youtube] Quality Assurance vs. Testing](https://www.youtube.com/watch?v=jZitXMQaXvE) 1102 | * [What's in a Good Error Message?](https://www.morling.dev/blog/whats-in-a-good-error-message/) 1103 | * [No, your pull request does not need a review](https://jeroenmols.com/blog/2022/02/23/pull-request-reviews/) 1104 | * [The Hardest Part of Being a Software Manager](https://medium.com/javascript-scene/the-hardest-part-of-being-a-software-manager-5293b1b02f94) 1105 | * [Self-Managing vs. Manager-Free Organizations](https://www.yegor256.com/2020/12/22/self-managing-orgs.html) 1106 | * [Yes, Virginia, You Can Estimate That](https://skamille.medium.com/yes-virginia-you-can-estimate-that-e33303eec9cf) 1107 | * [Imposters to Win!](https://www.yegor256.com/2021/03/03/imposters-to-win.html) 1108 | * [Are you out of alignment?](https://skamille.medium.com/are-you-out-of-alignment-a7b193ab7fc4) 1109 | * [Calibrated Achievement Points](https://www.yegor256.com/2021/10/12/calibrated-achievement-points.html) 1110 | * [5 daily habits of senior engineers](https://medium.com/developer-purpose/5-daily-habits-of-kick-ss-engineers-67a053759e04) 1111 | * [How I Use Slack](https://gpeal.medium.com/how-i-use-slack-b0dbf06d9a18) 1112 | * [Top 3 Challenges After Becoming an Engineering Manager](https://magdamiu.com/2023/02/11/top-3-challenges-after-becoming-an-engineering-manager/) 1113 | * [Dear Manager, You’re Holding Too Many Meetings](https://hbr.org/2022/03/dear-manager-youre-holding-too-many-meetings) 1114 | * [Code Changes Should Be Small or Mechanical](https://publicobject.com/2023/01/08/small-or-mechanical/) 1115 | * [Are meetings making you less productive?](https://stackoverflow.blog/2023/04/12/are-meetings-making-you-less-productive/) 1116 | * [10 Things to do when starting a new job](https://www.danijelavrzan.com/posts/2023/04/start-new-job/) 1117 | * [Your Boss Has No Clue](https://www.drorpoleg.com/your-boss-has-no-clue/) 1118 | * [[Youtube] 5 Tips for Working On A Team as a Mobile Developer](https://www.youtube.com/watch?v=9xQ9x0VBtFI) 1119 | * [The Best Advice I Have Ever Been Given](https://medium.com/bilue/the-best-advice-i-have-ever-been-given-d36f3724e86c) 1120 | * [Farm or Grind](https://publicobject.com/2023/06/10/farm-or-grind/) 1121 | * [Modern work requires attention. Constant alerts steal it](https://stackoverflow.blog/2023/05/22/modern-work-requires-attention-constant-alerts-steal-it/) 1122 | * [The hardest part of building software is not coding, it’s requirements](https://stackoverflow.blog/2023/06/26/the-hardest-part-of-building-software-is-not-coding-its-requirements) 1123 | * [From Teammate to Team Lead – A Balancing Act](https://infinum.com/blog/from-teammate-to-team-lead/) 1124 | * [Managing Complex Change](https://addyosmani.com/blog/managing-complex-change/) 1125 | * [4 Engineering Slides CEOs Love (That You Can Have For Free)](https://devinterrupted.substack.com/p/4-engineering-slides-ceos-love-that) 1126 | * [7 Signals That You Aren’t a Competent Senior Developer (Yet)](https://medium.com/@tsecretdeveloper/7-signals-that-you-arent-a-competent-senior-yet-72c8a7be917f) 1127 | * [The Five Things Software Engineers Hate About Their Jobs](https://mikaelvesavuori.medium.com/the-five-things-software-engineers-hate-about-their-jobs-a7e3b037cca4) 1128 | * [How Programmers Can Spot a Bad Company](https://javascript.plainenglish.io/how-programmers-can-spot-a-bad-company-8073f79ed1a1) 1129 | * [The 7 Most Stressful Things About Working In An Office](https://medium.com/writers-blokke/the-7-most-stressful-things-about-working-in-an-office-fed63899896a) 1130 | * [5 Clues That You’re in a Toxic Software Dev Company](https://medium.com/@tsecretdeveloper/5-clues-that-youre-in-a-toxic-software-dev-company-fa678ba1750) 1131 | * [My Friend Quit a $160k Job Because It Was a “Developer’s Trap”](https://javascript.plainenglish.io/my-friend-quit-a-160k-job-because-it-was-a-developers-trap-e789a630c0ac) 1132 | * [Why does Software Engineering take so long?](https://medium.com/source-and-buggy/why-does-software-engineering-take-so-long-77a3f1832739) 1133 | * [Good Manager / Bad Manager](https://medium.com/@mike.s.chambers/good-manager-bad-manager-3a312bb8e9af) 1134 | * [Why Good Engineers Leave Good Companies](https://betterprogramming.pub/why-good-engineers-leave-good-companies-c6f8ae715df9) 1135 | * [The 7 Signs of a Bad Programmer](https://medium.com/@tsecretdeveloper/the-7-signs-of-a-bad-programmer-a624204f7222) 1136 | * [10 Signs of Toxicity in Teams You Shouldn’t Ignore](https://levelup.gitconnected.com/10-signs-of-toxicity-in-teams-you-shouldnt-ignore-eeb95961979a) 1137 | * [Measuring Technical Debt to Avoid the Boiling Frog Syndrome](https://medium.com/booking-com-development/measuring-technical-debt-to-avoid-the-boiling-frog-syndrome-c44eb48b3ce1) 1138 | * [CTO vs. VP of Engineering: Defining Technical Titles](https://medium.com/beyond-the-code-by-typo/cto-vs-vp-of-engineering-defining-technical-titles-a83328819c81) 1139 | * [Remote Work Isn’t Dead – An Inevitable Uprising is Brewing](https://medium.com/swlh/remote-work-isnt-dead-an-inevitable-uprising-is-brewing-c36961c5dc2c) 1140 | * [Software engineering: problem-solving and critical-thinking](https://addyosmani.com/blog/softeng-problem-solving/) 1141 | * [Why Job Hops Don’t Harm Experienced Developers](https://medium.com/codex/why-job-hops-dont-harm-experienced-developers-3f2167a25b52) 1142 | * [The True Cost of Technical Debt](https://mhweiner.medium.com/the-true-cost-of-technical-debt-5c668020b0e4) 1143 | * [How Engineers Can Identify Good (and Avoid Bad) Companies](https://betterprogramming.pub/how-engineers-can-identify-good-and-avoid-bad-companies-d241b94ee2ff) 1144 | * [Why Do Developers Quit Their Jobs?](https://drpicox.medium.com/why-do-developers-quit-their-jobs-c20f884faccb) 1145 | * [Too Many Meetings Is Not Your Problem](https://medium.com/onebigthought/too-many-meetings-is-not-your-problem-7eafa7ae477c) 1146 | * [I Needed to Rewire My Brain at the First Year at Big Tech](https://medium.com/womenintechnology/i-needed-to-re-wire-my-brain-at-the-first-year-at-big-tech-a635f88edc0e) 1147 | * [Why so many software engineers are that bad?](https://medium.com/@victor.ronin/why-so-many-software-engineers-are-that-bad-9ab5f29ee47a) 1148 | * [How to hedge against layoffs](https://medium.com/@mike.s.chambers/how-to-hedge-against-layoffs-4c46ffd54668) 1149 | * [What is broken with hiring in tech?](https://medium.com/@victor.ronin/what-is-broken-with-hiring-in-tech-4d9d1b5d3268) 1150 | * [15 Reasons Why People Should Change Jobs (but rarely do)](https://tldr0.medium.com/15-reasons-why-people-should-change-jobs-but-often-dont-53ec9cab7e17) 1151 | * [Experienced Developers, Don’t Believe These 5 Deadline Myths to Become More Effective](https://medium.com/codex/experienced-developers-dont-believe-these-5-deadline-myths-to-become-more-effective-5c292811a02a) 1152 | * [Useless Features Are The Biggest Bugs](https://drpicox.medium.com/rethinking-software-bugs-in-business-decisions-c5a35854dc7d) 1153 | * [Here’s what I do all day as a staff engineer](https://blog.developerpurpose.com/heres-what-i-do-all-day-as-a-staff-engineer-2e36d6ca1533) 1154 | * [The “Left Hand, Right Hand” Problem Of Most Organizations](https://tedbauer.medium.com/the-left-hand-right-hand-problem-of-most-organizations-d58177b626ea) 1155 | * [5 Causes of Underperforming Teams](https://code.likeagirl.io/95-causes-of-underperforming-teams-9f4e07adeea1) 1156 | * [Why Do Big Companies Ask Unrealistic Software Engineering Interview Questions?](https://tomaszs2.medium.com/why-do-big-companies-ask-unrealistic-software-engineering-interview-questions-cb23639ca5d0) 1157 | * [The #1 Skill Every Developer Needs (And It’s Not Coding)](https://medium.com/@PurpleGreenLemon/the-1-skill-every-developer-needs-and-its-not-coding-3f86800cea4c) 1158 | * [5 Habits Overperforming Developers Should Drop if They Want to Be Better Teammates](https://medium.com/codex/5-habits-overperforming-developers-should-drop-if-they-want-to-be-better-teammates-e2d2afbc0025) 1159 | * [What’s Right Is Not Always Right for You](https://cupsofcode.com/post/whats_right_isnot_always_right_for_you/) 1160 | * [Asking for Estimates: The Telltale Sign of Ineffective Software Development Practices](https://drpicox.medium.com/asking-for-estimates-the-telltale-sign-of-ineffective-software-development-practices-cd54a9d8c60d) 1161 | * [Cannot Measure Productivity](https://www.martinfowler.com/bliki/CannotMeasureProductivity.html) 1162 | * [Analysis: The Quickest Path To Halving Software Delivery Time](https://devinterrupted.substack.com/p/analysis-the-quickest-path-to-halving) 1163 | * [McKinsey Has Solved Developer Productivity Measurement](https://levelup.gitconnected.com/mckinsey-has-solved-developer-productivity-measurement-73ec7125f0cf) 1164 | * [This is What is Killing Hardcore Programmers](https://medium.com/@tsecretdeveloper/this-is-what-is-killing-hardcore-programmers-118a539e15d) 1165 | * [Never ask for a raise or a promotion](https://mateusclira.medium.com/never-ask-for-a-raise-or-a-promotion-3a2f19627b2d) 1166 | * [Don’t Sleep With Your Boss](https://www.drorpoleg.com/dont-sleep-with-your-boss/) 1167 | * [Would You Return to the Office for a 30% Pay Increase?](https://code.likeagirl.io/would-you-return-to-the-office-for-a-30-pay-increase-d64c4b0445ed) 1168 | * [How to Deal With a Bad Day at Work](https://betterprogramming.pub/how-to-deal-with-a-bad-day-at-work-89d85ecc57bb) 1169 | * [Do Professional Programmers Really Spend 8 Hours a Day Writing Code?](https://blog.stackademic.com/do-professional-programmers-really-spend-8-hours-a-day-writing-code-435e73b75d07) 1170 | * [If Developers Nail Estimates, They Are Lying To You](https://drpicox.medium.com/if-developers-nail-estimates-they-are-lying-to-you-1b69a3ad5ad0) 1171 | * [We’re in a software crisis again, but AI won’t replace anyone anytime soon.](https://medium.com/@jankammerath/were-in-a-software-crisis-again-but-ai-won-t-replace-anyone-anytime-soon-5fe0cca2a5f0) 1172 | * [Include This In Your Estimates](https://medium.com/@mokagio/include-this-in-your-estimates-adf5395c7185) 1173 | * [Software Development is Nonlinear System](https://blog.danlew.net/2024/07/23/software-development-is-nonlinear-system/) 1174 | * [Things I value in a Software Engineer](https://medium.com/@mike.s.chambers/things-i-value-in-a-software-engineer-3416a2b01b8f) 1175 | * [When Can You Tell That Companies Don’t Know What They Are Doing](https://blog.stackademic.com/when-can-you-tell-that-companies-dont-know-what-they-are-doing-bcf1e12eb2e4) 1176 | * [We All Know AI Can’t Code, Right?](https://ehandbook.com/we-all-know-ai-cant-code-right-2a60160f61ad) 1177 | * [The Dark Side of Remote Work No One Talks About](https://medium.com/thought-thinkers/the-dark-side-of-remote-work-no-one-talks-about-8079b64a475d) 1178 | * [If you don’t have time to do it right, when will you have time to do it over?](https://medium.com/analysts-corner/if-you-dont-have-time-to-do-it-right-when-will-you-have-time-to-do-it-over-947c38cbbd35) 1179 | * [I’ve been employed in tech for years, but I’ve almost never worked](https://emaggiori.com/employed-in-tech-for-years-but-almost-never-worked/) 1180 | * [Why the return to the office isn’t working](https://medium.com/enrique-dans/why-the-return-to-the-office-isnt-working-927aec8fe742) 1181 | * [The Real Reasons Your Best Employees Leave](https://medium.com/career-paths/the-real-reasons-your-best-employees-leave-fc37cf7643a4) 1182 | * [How to create a welcoming codebase](https://heits.digital/articles/how-to-create-a-welcoming-codebase) 1183 | * [From Good to Great: The Power of Empathy in Programming](https://medium.com/design-bootcamp/from-good-to-great-the-power-of-empathy-in-programming-2f9bcab47f01) 1184 | * [4 Weird Signs of a Mediocre Self-Taught Programmer](https://levelup.gitconnected.com/4-weird-signs-of-a-mediocre-self-taught-programmer-dcf3777cd80a) 1185 | * [Why Most Programmers Are Actually Bad at Programming: The Uncomfortable Truth About Our Industry](https://medium.com/mr-plan-publication/why-most-programmers-are-actually-bad-at-programming-the-uncomfortable-truth-about-our-industry-6bc7bcb48c09) 1186 | * [Forcing Employees Back to the Office Has Nothing to Do With Productivity](https://medium.com/canadeh/forcing-employees-back-to-the-office-has-nothing-to-do-with-productivity-add5ace1d734) 1187 | * [Seven Signs Your Tech Job Is Awful](https://bakertab86.medium.com/six-signs-your-tech-job-is-awful-ac4552d99330) 1188 | * [Myths That Most Programmers Still Believe](https://levelup.gitconnected.com/myths-that-most-programmers-blindly-believe-bd2d1a55b7de) 1189 | * [LLM won’t learn for you](https://medium.com/@victor.ronin/llm-wont-learn-for-you-37e55c971d1e) 1190 | * [The Dirty Secret of “Clean Code” No One Talks About](https://medium.com/madhash/the-dirty-secret-of-clean-code-no-one-talks-about-125224f1f2c7) 1191 | * [Why Tech’s Loudest ‘Experts’ Are Often the Worst Coders: Confronting the Dunning-Kruger Epidemic](https://medium.com/mr-plan-publication/why-techs-loudest-experts-are-often-the-worst-coders-confronting-the-dunning-kruger-epidemic-38761907f012) 1192 | * [LinkedIn Is A F*cked Up Circus — Flee](https://medium.com/my-unpopular-opinion/linkedin-is-a-f-cked-up-circus-5c1bc1248f1f) 1193 | * [Apple Speaks the Truth About AI. It’s Not Good](https://medium.com/@ignacio.de.gregorio.noblejas/apple-speaks-the-truth-about-ai-its-not-good-8f72621cb82d) 1194 | * [Software Architecture — Things That No One Has Told You](https://levelup.gitconnected.com/software-architecture-things-that-no-one-has-told-you-c098bbb70a61) 1195 | * [How To Create Compound Efficiencies In Engineering](https://devinterrupted.substack.com/p/how-to-create-compound-efficiencies) 1196 | * [LLM as a software engineer](https://medium.com/@victor.ronin/llm-as-a-software-engineer-c4abda158414) 1197 | * [7 Productivity Hacks I Learned from a Principal Software Engineer!](https://medium.com/the-pythonworld/7-productivity-hacks-i-learned-from-a-principal-software-engineer-cec0e93f472d) 1198 | * [Your Clean Code Might Be Someone Else’s Technical Debt](https://drpicox.medium.com/your-clean-code-might-be-someone-elses-technical-debt-3cefdd8fa17f) 1199 | * [“It Works, Don’t Touch It” Is a Recipe for Disaster](https://medium.com/madhash/it-works-dont-touch-it-is-a-recipe-for-disaster-and-here-s-why-your-code-will-hate-you-later-08236e310b3f) 1200 | * Code review 1201 | * [Better Code Review](https://medium.com/retailmenot-engineering/better-code-review-part-3-4efb568885) 1202 | * [Does Code Review Involve Testing?](https://www.yegor256.com/2019/12/03/testing-in-code-review.html) 1203 | * [Code Reviews Q&A](https://medium.com/babylon-engineering/code-reviews-q-a-f33c72d3b2c3) 1204 | * [Code Reviews ?— Good luck with that](https://medium.com/analytics-vidhya/code-reviews-good-luck-with-that-a42982b54b3d) 1205 | * [Effective Code Reviews](https://addyosmani.com/blog/code-reviews/) 1206 | * Agile/Scrum/Kanban 1207 | * [What's the Difference? Agile vs Scrum vs Waterfall vs Kanban](https://www.smartsheet.com/agile-vs-scrum-vs-waterfall-vs-kanban) 1208 | * [[Youtube] Agile is Dead](https://www.youtube.com/watch?v=a-BOSpxYJ9M) 1209 | * [Agile is Wrong — Part 1: Scope and Requirements Changes](https://medium.com/@daptronic/agile-is-wrong-part-1-scope-and-requirements-changes-37c653fd53e5) 1210 | * [Another View of Agile Software Development](https://levelup.gitconnected.com/another-view-of-agile-software-development-263590cd16b8) 1211 | * [What tech leader can learn from direct reports’ performance reviews](https://medium.com/@froger_mcs/what-tech-leader-can-learn-from-direct-reports-performance-reviews-3f5ed7dc4cec) 1212 | * [The mythical 10x programmer](http://antirez.com/news/112) 1213 | * [“Sprints”: The biggest mistake of Software Engineering](https://medium.com/@noriller/sprints-the-biggest-mistake-of-software-engineering-34115e7de008) 1214 | * [Agile Teams Require Socially Skilled Developers](https://medium.com/@tsecretdeveloper/agile-teams-require-socially-skilled-developers-a39bf7dc95f0) 1215 | * [Dear Scrum, It’s Not Me, It’s You](https://medium.com/@alexponomarev/dear-scrum-its-not-me-it-s-you-222302a13a62) 1216 | * [Agile Projects Have Become Waterfall Projects With Sprints](https://itnext.io/agile-projects-have-become-waterfall-projects-with-sprints-536141801856) 1217 | * [5 practices that give Scrum an undeserved bad reputation](https://medium.com/@WJAgeling/5-practices-that-give-scrum-an-undeserved-bad-reputation-78e2282bbed5) 1218 | * [Scrum Is a Project Management System for a World That No Longer Exists](https://medium.com/@PurpleGreenLemon/scrum-is-a-project-management-system-for-a-world-that-no-longer-exists-ac742a7634e0) 1219 | * Feature flags 1220 | * [Feature Flags - Why you should care](https://jeroenmols.com/blog/2019/08/13/featureflags/) 1221 | * [Remote feature flags do not always come for free](https://proandroiddev.com/remote-feature-flags-do-not-always-come-for-free-a372f1768a70) 1222 | * [Feature toggles in trunk based development — Android take](https://medium.com/baracoda-engineering/feature-toggles-in-trunk-based-development-android-take-d50cd4bc977) 1223 | --- 1224 | 1225 | ## Life 1226 | [back to top](#readme) 1227 | * Main 1228 | * [40 Hours is enough](https://hackernoon.com/40-hours-is-enough-86d7166911ea) 1229 | * [The egoless programmer](https://8thlight.com/blog/daniel-irvine/2016/09/30/the-egoless-programmer.html) 1230 | * [Professional Developer: What Does It Mean?](https://www.thedroidsonroids.com/blog/professional-developer-what-does-it-mean) 1231 | * [I Don’t Have Time is a Myth](http://www.donnfelker.com/i-dont-have-time-is-a-myth/?utm_source=androiddevdigest) 1232 | * [I "Love" Anti-patterns](https://dev.to/levimoreira/i-love-anti-patterns-1bj1) 1233 | * [Soft Skills Demystified](https://www.yegor256.com/2018/08/29/soft-skills.html) 1234 | * [How to Be a Good Office Slave](https://www.yegor256.com/2015/10/06/how-to-be-good-office-slave.html) 1235 | * [How to Pay Programmers Less](https://www.yegor256.com/2016/12/06/how-to-pay-programmers-less.html) 1236 | * [How to Be Lazy and Stay Calm](https://www.yegor256.com/2018/04/17/how-to-be-lazy.html) 1237 | * [Beyond Code; What It Takes to be a Great Software Engineer](https://medium.com/@trionkidnapper/virtues-of-a-highly-efficient-software-engineer-9353c940bc83) 1238 | * [One Simple Trick to Getting More Free Time](https://medium.com/@trionkidnapper/sone-simple-trick-to-getting-more-free-time-8bbc5e608c51) 1239 | * [What Motivates Me as a Programmer](https://www.yegor256.com/2017/09/19/what-motivates-me.html) 1240 | * [Being Absent While Being Present (don’t do this)](https://www.donnfelker.com/being-absent-while-being-present/) 1241 | * [How to Cut Corners and Stay Cool](https://www.youtube.com/watch?v=YBQoTZ-1X-o) 1242 | * [The Path to Career Happiness Begins with a Job that Sucks](https://medium.com/the-coffeelicious/the-path-to-career-happiness-begins-with-a-job-that-you-hate-ea0ff86e7b5c) 1243 | * [10 Ways Your Software Career Will Likely Be The Death Of You](https://medium.com/@toddhd/10-ways-your-software-career-will-likely-be-the-death-of-you-7cb98145d9e7) 1244 | * [I am Forky](https://medium.com/swlh/i-am-forky-5ad75ba8ab7f) 1245 | * [Be Unhappy to Be Happy](https://www.yegor256.com/2019/09/17/be-unhappy-to-be-happy.html) 1246 | * [How Passion for Programming Can Make us Worse at our Jobs](https://www.philosophicalhacker.com/post/programmer-passion-worse/) 1247 | * [What makes a good developer?](https://medium.com/snapp-mobile/what-makes-a-good-developer-702da6e108ec) 1248 | * [Work/life balance will make you a better software engineer](https://codewithoutrules.com/2016/11/10/work-life-balance-software-engineer/) 1249 | * [The not-so-passionate programmer: finding a job when you’re just a normal person](https://codewithoutrules.com/2016/11/30/not-a-passionate-programmer/) 1250 | * [Avoiding hour creep: get your work done and still go home at 5PM](https://codewithoutrules.com/2018/06/15/avoid-hour-creep/) 1251 | * [How to stay motivated](https://medium.com/@sgkantamani/how-to-stay-motivated-b1e7689ee1d4) 1252 | * [Join our startup, we’ll cut your pay by 40%](https://codewithoutrules.com/2017/09/18/when-startups-pay-less/) 1253 | * [Embrace the Chaos!](https://www.yegor256.com/2020/01/07/embrace-the-chaos.html) 1254 | * [Ugly Truths About Working From Home](https://medium.com/better-programming/ugly-truths-about-working-from-home-e9907c7091ba) 1255 | * [Hurdles Faced by a Freelancer](https://medium.com/better-programming/hurdles-faced-by-a-freelancer-66a1c73ea658) 1256 | * [Working From Home Productivity Tips](https://www.techyourchance.com/working-from-home-productivity-tips/) 1257 | * [Don’t Just Code, But Also C…](https://medium.com/swlh/dont-just-code-but-also-c-e27e86d708ef) 1258 | * [Freelancing](https://blog.stylingandroid.com/freelancing/) 1259 | * [Software Developers: Adapt or You’ll Be Replaced](https://medium.com/better-programming/software-developers-adapt-or-youll-be-replaced-efaa8c5b4d5) 1260 | * [What It’s Like Working From Home](https://www.ericthecoder.com/2021/05/17/what-its-like-working-from-home-as-a-software-engineer/) 1261 | * [Gear Up for Remote Work](https://medium.com/javascript-scene/gear-up-for-remote-work-d93cf61300f) 1262 | * [Put a Number on Your Boss's Emotions](https://www.yegor256.com/2020/12/29/metric-for-emotions.html) 1263 | * [OPP (Other People’s Problems)](https://skamille.medium.com/opp-other-peoples-problems-d7eb174724ee) 1264 | * [[Youtube] Keep a balance between work for money and investments into yourself](https://www.youtube.com/watch?v=SNAULZ4KRak) 1265 | * [The Overfinancialization of Everything](https://www.youngmoney.co/p/overfinancialization-everything) 1266 | * [23 Life Tasks For Sorting Out Your Life](https://www.ryandelaney.co/blog/life-tasks-for-sorting-out-your-life) 1267 | * [The Happiness Paradox](https://awealthofcommonsense.com/2023/03/the-happiness-paradox/) 1268 | * [Don't expect to be motivated everyday](https://addyosmani.com/blog/motivation/) 1269 | * [A 40+ Years Experienced Software Architect Advised Me How Not to Be Burned out as a Developer](https://javascript.plainenglish.io/a-40-years-experienced-software-architect-advised-me-how-not-to-be-burned-out-as-a-developer-eee8ceb620b1) 1270 | * [Dear Devs… Listen to Bill Gate’s “There’s More to Life Than Work”](https://javascript.plainenglish.io/dear-devs-listen-to-bill-gates-there-s-more-to-life-than-work-f5bd5fd29f2f) 1271 | * [Lay offs are a reminder to NOT prioritize your work (The Fatal Mistake Devs make)](https://medium.com/@jamesryebread/lay-offs-are-a-reminder-to-not-prioritize-your-work-the-fatal-mistake-devs-make-a07f4d5513d8) 1272 | * [Make Every Second Count: Strategies to Unleash Creativity and Success at Any Time](https://www.donnfelker.com/make-every-second-count/) 1273 | * [Open Source Is Struggling And It’s Not Big Tech That Is To Blame](https://medium.com/@jankammerath/open-source-is-struggling-and-its-not-big-tech-that-is-to-blame-cfba964219f8) 1274 | * [Feeling Overwhelmed? You Need an MVD—That’s Minimum Viable Day](https://index.medium.com/feeling-overwhelmed-you-need-a-mvd-minimum-viable-day-bf07b7b90eb) 1275 | * [The Daily Battle for Brain Space](https://forge.medium.com/the-daily-battle-for-brain-space-829eab4f64ed) 1276 | * [Executives Are Now “Cranky” About An Employee “Dead Zone”](https://tedbauer.medium.com/executives-are-now-cranky-about-an-employee-dead-zone-b946c691917d) 1277 | * [5 Strategies to Help You Survive the Last Years Before Leaving The Rat Race](https://medium.com/illumination/5-strategies-to-help-you-survive-the-last-years-before-leaving-the-rat-race-380fd78d0e6e) 1278 | * [Why and How to Be a High Performer Even if You Don’t Like Your Job](https://medium.com/management-matters/why-and-how-to-be-a-high-performer-even-if-you-dont-like-your-job-658cd83d543e) 1279 | * [What You Need to Realize When You Turn 35 as a Programmer](https://blog.stackademic.com/what-you-need-to-realize-when-you-turn-35-as-a-programmer-b9a85e1be2a3) 1280 | * [This Killer Feature of My 9 to 5 Is Why I’m Not Quitting It](https://medium.com/career-paths/this-killer-feature-of-my-9-to-5-is-why-im-not-quitting-it-d0fcb8fb4979) 1281 | * [How do you survive every day at your shit job?](https://theordinaryman1.medium.com/how-do-you-survive-every-day-at-your-shit-job-fb40260a859f) 1282 | * [Are We Ever Really Here?](https://medium.com/the-springboard/are-we-ever-really-here-43eb67675921) 1283 | * [The Dark Side of Being a Freelancer That Has Made Me Consider Having a Full-Time Job Again](https://medium.com/swlh/the-dark-side-of-being-a-freelancer-that-has-made-me-consider-having-a-full-time-job-again-d51b37ec0496) 1284 | * [Productivity Systems I’ve Tried and My Honest Opinion on Each of Them](https://medium.com/publishous/productivity-systems-ive-tried-and-my-honest-opinion-on-each-of-them-e61dfa607bee) 1285 | * [My Model, My Baby](https://medium.com/@retire.early.in.mexico/my-model-my-baby-297895afa0a8) 1286 | * [Working on a Beach Sucks](https://medium.com/publishous/working-on-a-beach-sucks-745f51194e15) 1287 | * [What It Feels Like to Go Back to Corporate After 4 Years of Self-Employment](https://medium.com/career-paths/what-it-feels-like-to-go-back-to-corporate-after-4-years-of-self-employment-d3e06873c537) 1288 | * [I Thought Quitting My Job Was The Path to Freedom. I Was (Dead) Wrong](https://medium.com/change-your-mind/i-thought-quitting-my-job-was-the-path-to-freedom-i-was-dead-wrong-2227267527ca) 1289 | * [The Biggest Self-Help Myth That Is Making You Struggle With Productivity](https://medium.com/publishous/the-biggest-self-help-myth-that-is-making-you-struggle-with-productivity-f5d68f37ce22) 1290 | * [Here’s Why You Want A Really Boring Job](https://long.sweet.pub/heres-why-you-want-a-really-boring-job-40bcf683c415) 1291 | * [Why Most Google Employees Quit After 1.3 Years](https://medium.com/swlh/why-most-google-employees-quit-after-1-3-years-fdc4b08989a3) 1292 | * [You Have More Control Over Your Time Than You Think](https://levelup.gitconnected.com/you-have-more-control-over-your-time-than-you-think-as-a-software-engineer-8f218d815860) 1293 | * [I don’t want to be a great coder](https://blog.developerpurpose.com/i-dont-want-to-be-a-great-coder-9f847374b4de) 1294 | * [Why I will never be a Senior Software Engineer at Amazon](https://medium.com/@jamesryebread/why-i-will-never-be-a-senior-software-engineer-at-amazon-6613c66c2a6e) 1295 | * [If You Want Results, Leave Me Alone](https://medium.com/career-paths/if-you-want-results-leave-me-alone-f04bb68fa9ef) 1296 | * [5 Practical Ways To Fix Your Work-Life Balance](https://medium.com/engineering-managers-journal/5-practical-ways-to-fix-your-work-life-balance-86f78dd7aa5e) 1297 | * [I Spent 25 Years in Tech — Now I Wonder Why](https://medium.com/the-human-side-of-work/i-spent-25-years-in-tech-now-i-wonder-why-5c3e6213a17f) 1298 | * [Less Than 20% of Software Developers Are Happy with Their Jobs](https://levelup.gitconnected.com/less-than-20-of-software-developers-are-happy-with-their-jobs-c91e7bcb2bce) 1299 | * [You Don’t Need a Personal Brand to Be a Great Developer](https://medium.com/@PurpleGreenLemon/you-dont-need-a-personal-brand-to-be-a-great-developer-bdc0638f361c) 1300 | 1301 | --- 1302 | 1303 | # Libraries 1304 | 1305 | ## Rx 1306 | [back to top](#readme) 1307 | * Main 1308 | * [[Youtube] Introduction to Functional Reactive Programming](https://www.youtube.com/watch?v=_XKX6UQfNGY) 1309 | * [Unit Testing with RxJava](http://alexismas.com/blog/2015/05/20/unit-testing-rxjava/) 1310 | * [Concurrency in RxJava 2](https://code.tutsplus.com/tutorials/concurrency-in-rxjava-2--cms-29288) 1311 | * [Learning Observable By Building Observable](https://medium.com/@benlesh/learning-observable-by-building-observable-d5da57405d87) 1312 | * [Rx if the operators could speak](https://medium.freecodecamp.org/rx-if-the-operators-could-speak-58567c4618f1) 1313 | * [RxJava & State: The Basics](https://tech.instacart.com/rxjava-state-the-basics-f842eaee7ee1) 1314 | * [Understanding RxJava subscribeOn and observeOn](https://proandroiddev.com/understanding-rxjava-subscribeon-and-observeon-744b0c6a41ea) 1315 | * [How we migrated from RxJava1 to RxJava2](https://medium.com/lifesum-healthy-living-simplified/how-we-migrated-from-rxjava1-to-rxjava2-bcf0c9eb1a6f) 1316 | * [When you dont need map](https://blog.danlew.net/2018/02/20/when-you-dont-need-a-map) 1317 | * [[Youtube] Common RxJava Mistakes](https://www.youtube.com/watch?v=QdmkXL7XikQ) 1318 | * [RxJava's repeatWhen and retryWhen, explained](https://blog.danlew.net/2016/01/25/rxjavas-repeatwhen-and-retrywhen-explained/) 1319 | * [RxJava2 puzzle: Scheduler as 3rd parameter](https://www.glureau.com/2020/04/29/RxJava-Puzzle-Scheduler-3rd-param/) 1320 | * [RxJava2 puzzle: Subscription threading](https://www.glureau.com/2020/05/01/RxJava-Puzzle-Subscription-Threading/) 1321 | * [RxJava2 subscribeOn: How to use it](https://www.glureau.com/2020/05/02/RxJava-SubscribeOn-HowTo/) 1322 | * [Operators for Transforming Observables](https://proandroiddev.com/exploring-rxjava-in-android-operators-for-transforming-observables-367c22d86677) 1323 | * [How RxJava chain actually works](https://proandroiddev.com/how-rxjava-chain-actually-works-2800692f7e13) 1324 | * [Understanding hot vs cold Observables](https://luukgruijs.medium.com/understanding-hot-vs-cold-observables-62d04cf92e03) 1325 | * Error 1326 | * [Error handling in RxJava](http://blog.danlew.net/2015/12/08/error-handling-in-rxjava/) 1327 | * [The RxJava2 Default Error Handler](https://medium.com/@bherbst/the-rxjava2-default-error-handler-e50e0cab6f9f) 1328 | * [Clean architecture — error handling with Kotlin/RxJava](https://medium.com/@june.pravin/clean-architecture-error-handling-with-kotlin-rxjava-d01c82a0f31e) 1329 | * [Default Error Handling With RxJava](https://medium.com/@s.vinouze/default-error-handling-with-rxjava-89b79de3f125) 1330 | * Backpressure 1331 | * [RxJava Backpressure and why should you care?](https://proandroiddev.com/rxjava-backpressure-and-why-you-should-care-369c5242c9e6) 1332 | * Android 1333 | * [[Youtube] Exploring RxJava 2 for Android](https://www.youtube.com/watch?v=htIXKI5gOQU) 1334 | * [RxJava cheat sheet, with a pinch of Android](https://zeroturnaround.com/rebellabs/rxjava-cheat-sheet-with-a-pinch-of-android/) 1335 | * [Retrofit 2 and Rx Java call adapter error handling](http://bytes.babbel.com/en/articles/2016-03-16-retrofit2-rxjava-error-handling.html) 1336 | * [Server polling and retrying failed operations, with Retrofit and RxJava](https://medium.com/@v.danylo/server-polling-and-retrying-failed-operations-with-retrofit-and-rxjava-8bcc7e641a5a) 1337 | * [Overriding RxAndroid Schedulers in RxJava 2](https://medium.com/@peter.tackage/overriding-rxandroid-schedulers-in-rxjava-2-5561b3d14212) 1338 | * [LCE: Modeling Data Loading in RxJava](https://tech.instacart.com/lce-modeling-data-loading-in-rxjava-b798ac98d80) 1339 | * [MVVM + RxJava: Common Mistakes](http://upday.github.io/blog/mvvm_rx_common_mistakes/) 1340 | * [RxJava2 and Retrofit2 Error Handling on a single place](https://medium.com/mindorks/rxjava2-and-retrofit2-error-handling-on-a-single-place-8daf720d42d6) 1341 | * [Building an AutoCompleting EditText using RxJava](https://proandroiddev.com/building-an-autocompleting-edittext-using-rxjava-f69c5c3f5a40) 1342 | * [[Youtube] Advanced RxJava and Conductor](https://www.youtube.com/watch?v=0XSf7sX2rCQ) 1343 | * [RxJava on the Sign In Screen](https://medium.com/@etiennelawlor/rxjava-on-the-sign-in-screen-9ecb66b88572) 1344 | * [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) 1345 | * [RxJava vs. Coroutines](https://blog.danlew.net/2021/01/28/rxjava-vs-coroutines/) 1346 | * [When And How To Use RxJava Disposable](http://cupsofcode.com/post/when_how_use_rxjava_disposable_serialdisposable_compositedisposable/) 1347 | * [RxJava 2: Where’s disposable when subscribe observer?](https://medium.com/mobile-app-development-publication/rxjava-2-wheres-disposable-when-subscribe-observer-4ec16049f2e1) 1348 | 1349 | --- 1350 | 1351 | ## DI 1352 | [back to top](#readme) 1353 | * Main 1354 | * [Android Injection Performance](https://github.com/Sloy/android-dependency-injection-performance) 1355 | * [Comparing Three Dependency Injection Solutions](https://androidessence.com/comparing-three-dependency-injection-solutions) 1356 | * [About DI Frameworks](https://codetwister.medium.com/about-di-frameworks-b617281421e) 1357 | * Dagger 2 1358 | * [Tasting Dagger 2 on Android](https://fernandocejas.com/2015/04/11/tasting-dagger-2-on-android/) 1359 | * [Dependency injection with Dagger 2 - Custom scopes](http://frogermcs.github.io/dependency-injection-with-dagger-2-custom-scopes/) 1360 | * [[Yotube] DAGGER 2 - A New Type of dependency injection](https://www.youtube.com/watch?v=oK_XtfXPkqw) 1361 | * [[Yotube] The Future of Dependency Injection with Dagger 2](https://www.youtube.com/watch?v=plK0zyRLIP8) 1362 | * [A Dagger to Remember](https://arturdryomov.dev/posts/a-dagger-to-remember/) 1363 | * [Clean Android Application class with Dependency Injection: AppInitializers](https://proandroiddev.com/clean-android-application-class-with-dependency-injection-appinitializer-45999096f955) 1364 | * [Keeping the Daggers Sharp](https://medium.com/square-corner-blog/keeping-the-daggers-sharp-%EF%B8%8F-230b3191c3f) 1365 | * [Abusing Dagger with Initializers](https://medium.com/@blipinsk/abusing-dagger-with-initializers-a1e742024ac8) 1366 | * [Dagger in Kotlin: Gotchas and Optimizations](https://medium.com/androiddevelopers/dagger-in-kotlin-gotchas-and-optimizations-7446d8dfd7dc) 1367 | * [Dagger 2, 2 Years Later](https://www.philosophicalhacker.com/post/dagger-2-years-later/) 1368 | * [From Dagger components to manual dependency injection](https://proandroiddev.com/from-dagger-components-to-manual-dependency-injection-110015abe6e0) 1369 | * [Dagger dependencies beyond the basics](https://proandroiddev.com/dagger-dependencies-beyond-the-basics-53474e48f932) 1370 | * [Injection into Android Component’s Constructors is real](https://proandroiddev.com/inject-into-android-component-constructor-4f5ddd27d06) 1371 | * [Facilitating dependency initialization with Dagger multibindings](https://medium.com/quick-code/facilitating-dependency-initialization-with-dagger-multibindings-e31f3323338f) 1372 | * [Dagger Tips: Leveraging AssistedInjection to inject ViewModels](https://proandroiddev.com/dagger-tips-leveraging-assistedinjection-to-inject-viewmodels-with-savedstatehandle-and-93fe009ad874) 1373 | * [How to Optimize Dagger Module](https://infinum.com/the-capsized-eight/how-to-optimize-dagger-module) 1374 | * [Dagger & Kotlin](https://medium.com/@naturalwarren/dagger-kotlin-3b03c8dd6e9b) 1375 | * Koin 1376 | * [[Youtube] Arnaud Giuliani - Dependency injection from zero to hero with Koin](https://www.youtube.com/watch?v=mt9yoWScgb8) 1377 | * Hilt 1378 | * [Exploring dagger hilt: an introduction](https://joebirch.co/android/exploring-dagger-hilt-an-introduction/) 1379 | * [Dependency Injection on Android with Hilt](https://medium.com/androiddevelopers/dependency-injection-on-android-with-hilt-67b6031e62d) 1380 | * [Create an application CoroutineScope using Hilt](https://medium.com/androiddevelopers/create-an-application-coroutinescope-using-hilt-dd444e721528) 1381 | * [Scoping in Android and Hilt](https://medium.com/androiddevelopers/scoping-in-android-and-hilt-c2e5222317c0) 1382 | * [Migrating from Dagger to Hilt — Is it worth it?](https://medium.com/androiddevelopers/migrating-from-dagger-to-hilt-is-it-worth-it-4cbbc8c93e33) 1383 | * [Hilt — Adding components to the hierarchy](https://medium.com/androiddevelopers/hilt-adding-components-to-the-hierarchy-96f207d6d92d) 1384 | 1385 | --- 1386 | 1387 | ## Net 1388 | [back to top](#readme) 1389 | * [Configuring Retrofit 2 Client in Android](https://proandroiddev.com/configuring-retrofit-2-client-in-android-130455eaccbd) 1390 | * [OkHttp & OAuth: Token Refreshes](https://blog.coinbase.com/okhttp-oauth-token-refreshes-b598f55dd3b2) 1391 | * [Maximizing OkHttp connection reuse](https://medium.com/booking-com-development/maximizing-okhttp-connection-reuse-b1f0ad6ec66c) 1392 | * [Retrofit — Effective error handling with Kotlin Coroutine and Result API](https://blog.canopas.com/retrofit-effective-error-handling-with-kotlin-coroutine-and-result-api-405217e9a73d) 1393 | 1394 | --- 1395 | 1396 | ## Other Libraries 1397 | [back to top](#readme) 1398 | * [Introducing Ruler: Our Tool for Measuring Android App Size](https://engineering.atspotify.com/2022/02/introducing-ruler-our-tool-for-measuring-android-app-size/) 1399 | * [Checklist Before Adding A Library To Your App](https://elye-project.medium.com/checklist-before-adding-a-library-to-your-app-5fbe123aee30) 1400 | --------------------------------------------------------------------------------