{"id":597055,"date":"2023-01-13T05:49:27","date_gmt":"2023-01-13T11:49:27","guid":{"rendered":"https:\/\/news.sellorbuyhomefast.com\/index.php\/2023\/01\/13\/write-admin-tools-from-day-one-2022\/"},"modified":"2023-01-13T05:49:27","modified_gmt":"2023-01-13T11:49:27","slug":"write-admin-tools-from-day-one-2022","status":"publish","type":"post","link":"https:\/\/newsycanuse.com\/index.php\/2023\/01\/13\/write-admin-tools-from-day-one-2022\/","title":{"rendered":"Write admin tools from day one (2022)"},"content":{"rendered":"<div id=\"post-body-1220831664419264345\">\n<p><a href=\"https:\/\/blogger.googleusercontent.com\/img\/b\/R29vZ2xl\/AVvXsEizrMEPniA2OHEzvaBI4dwosYzd9OicWV7hlQwequfMNU91ATI73EIiM3gWJT5zRwmyuiyLvNORrqAGriy_wYnrsl_p4yphdZ8jg8Pckn4v5MiK2DJa5Shz2aYivsH4YV7Yj-l-WCXpuYWKJuDY8O2AAdZH7RSHRVKa987zqan9gstMV_BdTtzmrA\/s475\/admin%20tool%20-%20chart%20(2).png\"><img loading=\"lazy\" decoding=\"async\" data-original-height=\"386\" data-original-width=\"475\" height=\"325\" src=\"https:\/\/blogger.googleusercontent.com\/img\/b\/R29vZ2xl\/AVvXsEizrMEPniA2OHEzvaBI4dwosYzd9OicWV7hlQwequfMNU91ATI73EIiM3gWJT5zRwmyuiyLvNORrqAGriy_wYnrsl_p4yphdZ8jg8Pckn4v5MiK2DJa5Shz2aYivsH4YV7Yj-l-WCXpuYWKJuDY8O2AAdZH7RSHRVKa987zqan9gstMV_BdTtzmrA\/w400-h325\/admin%20tool%20-%20chart%20(2).png\" width=\"400\"><\/a><\/p>\n<h2>The Problem<\/h2>\n<p>Writing useful features for your users is key to a successful product.\u00a0 It makes sense then that you should maximize your time writing features for those users.\u00a0 \u00a0This approach is very effective at the beginning of a product&#8217;s life, but over time, <b>you may find you are spending more time maintaining the product that developing it.<\/b><\/p>\n<p>Some of the biggest development time sucks can be:<\/p>\n<ul>\n<li>Tracking down the cause of unexpected behavior.<\/li>\n<li>Fixing data.<\/li>\n<li>Answering user, or team member questions.<\/li>\n<li>Running maintenance scripts, or other ad-hoc tasks.<\/li>\n<\/ul>\n<h2>The &#8220;Oh #&#038;@$&#8221; Solution<\/h2>\n<p>These small support tasks start to add up, and there is no easy way to offload the work to product, or support.\u00a0 You and your development team reach a breaking point where you must start prioritizing administrative tools. Unfortunately, you will slow down your new feature development even more in the short term.\u00a0 It will take time for those tools to be developed, and take effect to lower your support load.<\/p>\n<p><a href=\"https:\/\/blogger.googleusercontent.com\/img\/b\/R29vZ2xl\/AVvXsEhTdSjw1FwuuKx5yC7JSCUnSHevfz9EGnB2Ldm99FUdFp-CJU6Pbqnt4rlmW58dgzYp4E86E3H7MMs7XGIdY9sNJeJfi0HpriI5jJd7y-vOSdWgCgrYe5BeNNE6qQu6ljitqPoYXSwjA82FvoRrSlbIsG2i8J3wjl7SUEBbZWiWxCEqS1yTxLFfuw\/s475\/admin-tool-late.png\"><img loading=\"lazy\" decoding=\"async\" data-original-height=\"386\" data-original-width=\"475\" height=\"325\" src=\"https:\/\/blogger.googleusercontent.com\/img\/b\/R29vZ2xl\/AVvXsEhTdSjw1FwuuKx5yC7JSCUnSHevfz9EGnB2Ldm99FUdFp-CJU6Pbqnt4rlmW58dgzYp4E86E3H7MMs7XGIdY9sNJeJfi0HpriI5jJd7y-vOSdWgCgrYe5BeNNE6qQu6ljitqPoYXSwjA82FvoRrSlbIsG2i8J3wjl7SUEBbZWiWxCEqS1yTxLFfuw\/w400-h325\/admin-tool-late.png\" width=\"400\"><\/a><\/p>\n<h2>The Real Solution<\/h2>\n<p>The only way to avoid a growing support problem or a temporary slowdown is to allocate time to develop admin tools from day one.\u00a0 Provide useful administrative tools for your team, and other internal employees to leverage.\u00a0 Ideally, you want to write administrative tools along with the features.\u00a0 Include supportability in the acceptance criteria, or design documents. There will always be some support load the tools won&#8217;t be able to meet, but overall, the load will not grow.\u00a0 There is always time to improve the tools built into the development budget.\u00a0\u00a0<\/p>\n<p>Ideally, the time allocation should look like this:<\/p>\n<p><a href=\"https:\/\/blogger.googleusercontent.com\/img\/b\/R29vZ2xl\/AVvXsEggEybHuPPGZFL-wOYqGELfjUDycPyZvelQOjO5e-yWHZC7MBMSJ8_le-j0gfADFrKwReAPVn4e-c4W4EECevS1ZibGtoPE0i7q6Zh_nhnx0yMG9Jd18PMgi8amMAHyxqK_3BdIQkJL_sLujiV8ha-yjBBsRz3m_GPulyC-StigSkhNZt6K4lTNsA\/s475\/admin%20tool%20-%20early.png\"><img loading=\"lazy\" decoding=\"async\" data-original-height=\"386\" data-original-width=\"475\" height=\"325\" src=\"https:\/\/blogger.googleusercontent.com\/img\/b\/R29vZ2xl\/AVvXsEggEybHuPPGZFL-wOYqGELfjUDycPyZvelQOjO5e-yWHZC7MBMSJ8_le-j0gfADFrKwReAPVn4e-c4W4EECevS1ZibGtoPE0i7q6Zh_nhnx0yMG9Jd18PMgi8amMAHyxqK_3BdIQkJL_sLujiV8ha-yjBBsRz3m_GPulyC-StigSkhNZt6K4lTNsA\/w400-h325\/admin%20tool%20-%20early.png\" width=\"400\"><\/a><\/p>\n<p>The time allocated to support will never grow out of control.\u00a0 Issues will crop up that the tools cannot handle.\u00a0 These can be remedied each iteration using the ongoing budget for admin tool improvement.<\/p>\n<h2>What Tools To Provide<\/h2>\n<p>Admin tools come in various shapes and sizes.\u00a0 \u00a0Here are some ways to provide support capabilities to your non-engineering team members.<\/p>\n<h3>System Visibility<\/h3>\n<p>Many times, a support request to engineering is &#8220;why did this thing happen?&#8221;.\u00a0 \u00a0This typically stems from a lack of system visibility to the rest of your team.\u00a0<\/p>\n<p>An engineer may solve this by logging into the database directly, or poking through files stored on disk, or a cloud storage provider.\u00a0 This could also mean combing through logs.<\/p>\n<p>To support your team, provide them with saved views to logs.\u00a0 Maybe they are filterable to a specific user&#8217;s actions.\u00a0 Provide them with an analytics user to a database replica that has limited permissions.\u00a0 Give them wiki page or a short demo video on how to find basic data themselves.<\/p>\n<p>One unique solution I&#8217;ve used is to provide a Postman Collection that was shared with the team.\u00a0 Rather than describe the whole API, it had specific calls saved that were useful for support.<\/p>\n<h3>Data Modification<\/h3>\n<p>Once a user determines what is wrong, a common request is to modify sorted data.\u00a0 This could be an incorrectly formatted email address, or other data that is trivial to fix.\u00a0\u00a0<\/p>\n<p>To support this use case, I suggest using a 3rd party library that exposes a CRUD for internal users to modify system data.\u00a0 There are usually a handful of choices per stack.\u00a0 For Elixir, there is <a href=\"https:\/\/github.com\/aesmail\/kaffy\" target=\"_blank\" rel=\"noopener\">Kaffy<\/a>, and <a href=\"https:\/\/github.com\/mojotech\/torch\" target=\"_blank\" rel=\"noopener\">Torch<\/a>.\u00a0 For Laravel, there is <a href=\"https:\/\/nova.laravel.com\/\" target=\"_blank\" rel=\"noopener\">Nova<\/a>. For Python, there is <a href=\"https:\/\/docs.djangoproject.com\/en\/4.1\/ref\/contrib\/admin\/\" target=\"_blank\" rel=\"noopener\">Django Admin<\/a>.\u00a0 Typically you can expose CRUD for specific models, and even search \/ filter on model list views.<\/p>\n<h3>Support Actions<\/h3>\n<p>Another feature of most 3rd party administrative libraries is the ability to execute pre-defined support actions.\u00a0 \u00a0This is a great capability that works great for ongoing support tool development.\u00a0 If a support issue crops up more than once, you can easily create a new action to remedy it.\u00a0 \u00a0Since there is already a whole framework providing this, you most likely just need to write one new function that takes in a few parameters.\u00a0 The admin tool framework will provide the authentication, and framework to execute it.<\/p>\n<h3>Audit Trail<\/h3>\n<p>One key thing to consider when exposing administrative tools is to capture an audit trail.\u00a0 If users are able to modify the state of important or sensitive data, it should be logged who changed what, and when.\u00a0 This could be implemented by logging, or database triggers.\u00a0 This may not always be necessary, but if you have a larger team, and multiple people will be modifying things, it should be prioritized.<\/p>\n<h2>Where To Start?<\/h2>\n<p>Here are my recommendations for taking a support first approach to development.<\/p>\n<div>\n<ol>\n<li>Leverage a 3rd party admin framework from day one.<\/li>\n<ol>\n<li>Provides authorization to data \/ actions<\/li>\n<li>Provides visibility into data so team can answer questions on their own.<\/li>\n<li>Provides framework for developing and executing support actions quickly.<\/li>\n<\/ol>\n<li>Provide other visibility tools such as:<\/li>\n<ol>\n<li>Saved views of application logs.<\/li>\n<li>Database user with limited access to data.\u00a0 (Replica or warehouse is best).<\/li>\n<li>Limited access to other systems, such as email providers, media storage, etc.<\/li>\n<\/ol>\n<li>Write the minimal amount of support features, as you can easily add in more once your basic framework is set up.<\/li>\n<li>Provide wiki, and \/ or video tutorials on how to do basic support actions.\u00a0 My favorite way to do this is to just record myself testing the feature, and upload it to a support wiki.\u00a0\u00a0<\/li>\n<\/ol>\n<\/div>\n<h2>Conclusion<\/h2>\n<p>I hope this guide helps you understand the importance of including support tools for your team from day one of development.\u00a0 \u00a0I&#8217;ve found it to be a huge time saver.\u00a0 When I&#8217;ve worked on very small teams, it frees up my time as I&#8217;d be the only one who can do the support work.\u00a0 When I&#8217;ve worked on large teams, it&#8217;s saved me as there would have been too much request volume to deal with.\u00a0 \u00a0If you have any questions, just ask!<\/p>\n<\/div>\n<p><a href=\"http:\/\/milwaukeemaven.blogspot.com\/2022\/08\/write-admin-tools-from-day-one.html\" class=\"button purchase\" rel=\"nofollow noopener\" target=\"_blank\">Read More<\/a><br \/>\n Alejandro Paris<\/p>\n","protected":false},"excerpt":{"rendered":"<p>The ProblemWriting useful features for your users is key to a successful product.\u00a0 It makes sense then that you should maximize your time writing features for those users.\u00a0 \u00a0This approach is very effective at the beginning of a product&#8217;s life, but over time, you may find you are spending more time maintaining the product that<\/p>\n","protected":false},"author":1,"featured_media":597056,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[2734,46,23920],"tags":[],"class_list":{"0":"post-597055","1":"post","2":"type-post","3":"status-publish","4":"format-standard","5":"has-post-thumbnail","7":"category-admin","8":"category-technology","9":"category-write"},"aioseo_notices":[],"_links":{"self":[{"href":"https:\/\/newsycanuse.com\/index.php\/wp-json\/wp\/v2\/posts\/597055","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/newsycanuse.com\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/newsycanuse.com\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/newsycanuse.com\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/newsycanuse.com\/index.php\/wp-json\/wp\/v2\/comments?post=597055"}],"version-history":[{"count":0,"href":"https:\/\/newsycanuse.com\/index.php\/wp-json\/wp\/v2\/posts\/597055\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/newsycanuse.com\/index.php\/wp-json\/wp\/v2\/media\/597056"}],"wp:attachment":[{"href":"https:\/\/newsycanuse.com\/index.php\/wp-json\/wp\/v2\/media?parent=597055"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/newsycanuse.com\/index.php\/wp-json\/wp\/v2\/categories?post=597055"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/newsycanuse.com\/index.php\/wp-json\/wp\/v2\/tags?post=597055"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}