Last week, a friend of mine asked an interesting question: “Have you ever seen a code base without compromises?”.
We debated for a while and very quickly realized that this question is meaningless. The first thing I’ve learned about engineering (and, as a result, software design) is that any solution has advantages and disadvantages. Any choice you make when writing code is a compromise. After all, software engineering (including architecture and design) means to continuously balance things like: time to market, correctness, changeability, security, usability, performance… It’s impossible to have them all at once.
Two examples come in mind. No matter how solid your knowledge and practice of SOLID principles (pun intended) is, you cannot open your code to all possible types of change. You are always favouring one type of change over another. Usability vs. security is another typical compromise. After all, introducing a user name and password is an extra step for accessing a link of an application. It would be best for usability to avoid authentication completely, yet for security reasons you need to compromise.
I trust this is all common sense.
It’s surprising how prevalent the wish to avoid compromises is in the minds of programmers
I have one explanation for it. My mind as a programmer is a bit strange. For example, another friend asked me today if I can answer a question. What she really wanted to say was “do you have time to answer a question now?”. Yet I caught myself over thinking this simple question on many levels. I had time to answer it, but was I able to do it? I had no idea, and needed more data. But gathering more data takes time, so what if I the time ran out before I was able to answer the question? Would it be correct then to simply answer “yes”, since I have no idea if I really could do it? My instinct was to answer “possibly”, but how does this help the other party? Of course, I did answer ‘yes’ and I managed to help her. But I couldn’t escape this inner mental process.
As programmers, we hunger for precision. Computers are precise, after all. Yet very few things other than computers are precise. And then we realize little by little that even software engineering is doomed to be imprecise, since we everyday must make decisions based on partial or incorrect information. Further more, we need to work with people whose lack of precision is proverbial (at least for us): customers, sales, marketing. This ruins the ideal world of programs. I know many programmers who held a deep belief that if they only had more time, less pressure and better information they could build the perfect software. Yet, on a conscious level, we all know perfect software doesn’t really exist.
I believe the solution is in learning the deeper lessons of engineering, software architecture and software design: that every single decision you make favors one thing over another. A mindful programmer would continuously be conscious about the pros and cons for her decisions. This is obviously difficult, but I believe it’s possible with practice. I found the Architecture Kata a particularly useful format in this regard. Other ways to practice are: pair programming with the right people or mob programming.
Are you a mindful programmer? Let me know in the comments.
1 thought on “The Relentless Desire of Programmers to Avoid Compromise”
Raoul Duke
So the real thing, it seems to me, is to get some sense of classification / categorization of these things, to know when the compromise is better or worse. There’s a lot that can go into it.
Personally I would like to see a shift towards ever less compromise instead of looking for ways to justify it all. (Maybe if a dev role requirement was like to sometimes do stints doing maintenance / iterations of existing stuff, and not just whiz-bang green-field cool new features…)
When you dissected your friend’s question, socially that might have been awkward. Yes there can be a time to lighten up. But if we’re then moving on to actually taking about requirements, specs, or real implementation — please, do be a stick in the mud. I know I try to be. 😉
Comments are closed.
Manage Consent
To provide the best experiences, we use technologies like cookies to store and/or access device information. Consenting to these technologies will allow us to process data such as browsing behavior or unique IDs on this site. Not consenting or withdrawing consent, may adversely affect certain features and functions.
Functional
Always active
The technical storage or access is strictly necessary for the legitimate purpose of enabling the use of a specific service explicitly requested by the subscriber or user, or for the sole purpose of carrying out the transmission of a communication over an electronic communications network.
Preferences
The technical storage or access is necessary for the legitimate purpose of storing preferences that are not requested by the subscriber or user.
Statistics
The technical storage or access that is used exclusively for statistical purposes.The technical storage or access that is used exclusively for anonymous statistical purposes. Without a subpoena, voluntary compliance on the part of your Internet Service Provider, or additional records from a third party, information stored or retrieved for this purpose alone cannot usually be used to identify you.
Marketing
The technical storage or access is required to create user profiles to send advertising, or to track the user on a website or across several websites for similar marketing purposes.
var astra = {"break_point":"921","isRtl":"","is_scroll_to_id":"1","is_scroll_to_top":"1","is_header_footer_builder_active":"1","responsive_cart_click":"flyout","is_dark_palette":"","revealEffectEnable":"","ajax_url":"https://mozaicworks.com/wp-admin/admin-ajax.php","infinite_count":"2","infinite_total":"0","pagination":"infinite","infinite_scroll_event":"scroll","no_more_post_message":"No more posts to show.","grid_layout":{"desktop":"3","tablet":1,"mobile":1},"site_url":"https://mozaicworks.com","blogArchiveTitleLayout":"","blogArchiveTitleOn":"","show_comments":"Show Comments","enableHistoryPushState":"1","masonryEnabled":"","blogMasonryBreakPoint":"0","shop_infinite_count":"2","shop_infinite_total":"0","shop_total_products":"1","shop_pagination":"number","shop_infinite_scroll_event":"scroll","shop_no_more_post_message":"No more products to show.","shop_result_count_format":"Showing 1\u2013{count} of {total} results","checkout_prev_text":"Back to my details","checkout_next_text":"Proceed to payment","shop_quick_view_enable":"disabled","shop_quick_view_stick_cart":"","shop_quick_view_auto_height":"1","woo_cart_empty_featured_product":"","single_product_qty_ajax_nonce":"f4533d8bb3","quick_view_nonce":"fee635796c","single_product_ajax_add_to_cart":"1","is_cart":"","is_single_product":"","view_cart":"View cart","cart_url":"https://mozaicworks.com/cart","checkout_url":"https://mozaicworks.com/checkout","add_to_cart_options_single":"rt_add_to_cart","is_astra_pro":"1","shopRevealEffectEnable":""};
//# sourceURL=astra-theme-js-js-extra
document.addEventListener( 'wpcf7submit', e => turnstile.reset() );
//# sourceURL=cloudflare-turnstile-js-after
var astraAddon = {"is_elementor_active":"","sticky_active":"1","svgIconClose":"\u003Cspan class=\"ast-icon icon-close\"\u003E\u003C/span\u003E","hf_account_show_menu_on":"hover","hf_account_action_type":"link","hf_account_logout_action":"link","header_main_stick":"1","header_above_stick":"","header_below_stick":"","stick_header_meta":"","header_main_stick_meta":"","header_above_stick_meta":"","header_below_stick_meta":"","sticky_header_on_devices":"both","sticky_header_style":"none","sticky_hide_on_scroll":"1","break_point":"921","tablet_break_point":"768","mobile_break_point":"544","header_main_shrink":"1","header_animation_effect":"none","header_logo_width":"","responsive_header_logo_width":{"desktop":200,"tablet":"","mobile":150},"stick_origin_position":"","site_layout":"ast-full-width-layout","site_content_width":"1070","site_layout_padded_width":"1200","site_layout_box_width":"1024","header_builder_active":"1","component_limit":"10","single_product_sticky_product_image":"","single_product_sticky_product_image_top_offset":"0","cart_sticky_cart_totals":"","order_review_toggle_texts":{"toggle_show_text":"Show Order Summary","toggle_hide_text":"Hide Order Summary"},"check_user_exist_nonce":"bfb3704023","woocommerce_login_nonce":"60706542bc","is_logged_in":"","user_validation_msgs":{"error_msg":"Entered user detail is not a valid.","success_msg":"This user is already registered. Please enter the password to continue."},"checkout_order_review_sticky":"","cartflows_version":"","is_registration_required":"1","is_complete_package":"1","is_header_builder_active":"1"};
//# sourceURL=astra-addon-js-js-extra
var xoo_wsc_params = {"adminurl":"https://mozaicworks.com/wp-admin/admin-ajax.php","wc_ajax_url":"/?wc-ajax=%%endpoint%%","qtyUpdateDelay":"500","notificationTime":"5000","html":{"successNotice":"\u003Cul class=\"xoo-wsc-notices\"\u003E\u003Cli class=\"xoo-wsc-notice-success\"\u003E\u003Cspan class=\"xoo-wsc-icon-check_circle\"\u003E\u003C/span\u003E%s%\u003C/li\u003E\u003C/ul\u003E","errorNotice":"\u003Cul class=\"xoo-wsc-notices\"\u003E\u003Cli class=\"xoo-wsc-notice-error\"\u003E\u003Cspan class=\"xoo-wsc-icon-cross\"\u003E\u003C/span\u003E%s%\u003C/li\u003E\u003C/ul\u003E"},"strings":{"maxQtyError":"Only %s% in stock","stepQtyError":"Quantity can only be purchased in multiple of %s%","calculateCheckout":"Please use checkout form to calculate shipping","couponEmpty":"Please enter promo code"},"nonces":{"update_shipping_method_nonce":"0ff35ae28c"},"isCheckout":"","isCart":"","sliderAutoClose":"1","shippingEnabled":"","couponsEnabled":"1","autoOpenCart":"yes","addedToCart":"","ajaxAddToCart":"yes","showBasket":"always_show","flyToCart":"yes","flyToCartTime":"1500","productFlyClass":"","refreshCart":"no","fetchDelay":"200"};
//# sourceURL=xoo-wsc-main-js-js-extra
var complianz = {"prefix":"cmplz_","debug":"","user_banner_id":"1","set_cookies":[],"block_ajax_content":"0","banner_version":"22","version":"7.5.4","store_consent":"","do_not_track_enabled":"1","consenttype":"optin","region":"eu","geoip":"","dismiss_timeout":"","disable_cookiebanner":"","soft_cookiewall":"","dismiss_on_scroll":"","cookie_expiry":"365","url":"https://mozaicworks.com/wp-json/complianz/v1/","locale":"lang=en&locale=en_US","set_cookies_on_root":"0","cookie_domain":"","current_policy_id":"26","cookie_path":"/","categories":{"statistics":"statistics","marketing":"marketing"},"tcf_active":"","placeholdertext":"Click to accept {category} cookies and enable this content","css_file":"https://mozaicworks.com/wp-content/uploads/complianz/css/banner-{banner_id}-{type}.css?v=22","page_links":{"eu":{"cookie-statement":{"title":"Cookie Policy ","url":"https://mozaicworks.com/cookie-policy-eu"},"privacy-statement":{"title":"Terms And Conditions","url":"https://mozaicworks.com/terms-and-conditions"},"impressum":{"title":"Private: Contact Old","url":"https://mozaicworks.com/?page_id=12523"}},"us":{"impressum":{"title":"Private: Contact Old","url":"https://mozaicworks.com/?page_id=12523"}},"uk":{"impressum":{"title":"Private: Contact Old","url":"https://mozaicworks.com/?page_id=12523"}},"ca":{"impressum":{"title":"Private: Contact Old","url":"https://mozaicworks.com/?page_id=12523"}},"au":{"impressum":{"title":"Private: Contact Old","url":"https://mozaicworks.com/?page_id=12523"}},"za":{"impressum":{"title":"Private: Contact Old","url":"https://mozaicworks.com/?page_id=12523"}},"br":{"impressum":{"title":"Private: Contact Old","url":"https://mozaicworks.com/?page_id=12523"}}},"tm_categories":"","forceEnableStats":"","preview":"","clean_cookies":"","aria_label":"Click to accept {category} cookies and enable this content","iapi_nav":"fallback"};
//# sourceURL=cmplz-cookiebanner-js-extra
So the real thing, it seems to me, is to get some sense of classification / categorization of these things, to know when the compromise is better or worse. There’s a lot that can go into it.
Personally I would like to see a shift towards ever less compromise instead of looking for ways to justify it all. (Maybe if a dev role requirement was like to sometimes do stints doing maintenance / iterations of existing stuff, and not just whiz-bang green-field cool new features…)
When you dissected your friend’s question, socially that might have been awkward. Yes there can be a time to lighten up. But if we’re then moving on to actually taking about requirements, specs, or real implementation — please, do be a stick in the mud. I know I try to be. 😉