Ten years ago Rudolf Winestock wrote The Lisp Curse, an essay that ​“attempt[ed] to recÂonÂcile the powÂer of the Lisp proÂgramÂming lanÂguage with the inabilÂiÂty of the Lisp comÂmuÂniÂty to reproÂduce their pre-AI Winter achievements.”
His conÂcluÂsion? The powÂer and expresÂsiveÂness of Lisp have conÂspired to keep its develÂopÂers indiÂvidÂuÂalÂly proÂducÂtive, but colÂlecÂtiveÂly unable to orgaÂnize their work into comÂplete, stanÂdardÂized, well-​documented, ‑testÂed, and ‑mainÂtained packÂages that they could coaÂlesce into interÂopÂerÂaÂble and widely-​adopted soluÂtions. Everything from object sysÂtems to types to asynÂchroÂnous non-​blocking proÂgramÂming and conÂcurÂrenÂcy is up for grabs and has mulÂtiÂple comÂpetÂing implementations.
These social effects have doomed Lisp to also-​ran staÂtus in an indusÂtry where ​“employÂers much preÂfer that workÂers be funÂgiÂble, rather than maxÂiÂmalÂly proÂducÂtive.” Free toolÂing supÂport has lagged; although Emacs can be hacked endÂlessÂly to do anyÂthing, there is no out-​of-​the-​box inteÂgratÂed develÂopÂment enviÂronÂment or batteries-​included defaults to immeÂdiÂateÂly ease new proÂgramÂmers into their job.
Does this all sound familÂiar to Perl developers?
Perl is renowned for its expresÂsive capaÂbilÂiÂties, enshrined in the TIMTOWTDI (There Is More Than One Way To Do It) design prinÂciÂple. Stories abound of the proÂducÂtivÂiÂty achieved by Perl proÂgramÂmers stitchÂing togethÂer modÂules from CPAN with their own code. Select an objectsysÂtem (or don’t), maybe throw in an excepÂtionhanÂdler (or don’t), and you too can have a codeÂbase that felÂlow develÂopÂers criÂtique for not folÂlowÂing their favored techÂniques. Meanwhile, manÂagers are strugÂgling to fill the rest of the team with new proÂgramÂmers lookÂing for IDE supÂport and findÂing only a grab-​bag of Vim extensions.
Mark, someÂwhat relatÂed to ​“senÂsiÂble defaults” is the way there basiÂcalÂly is no easy way to wade through thouÂsands and thouÂsands of CPAN modÂules, many of which are crufty, in order to deterÂmine which modÂule proÂvides the best soluÂtion for a parÂticÂuÂlar probÂlem. The size of CPAN and lack of rankÂings or some sort of ​“best pracÂtices” guide to them is a liaÂbilÂiÂty in a sense, because it makes Perl as a lanÂguage feel comÂpliÂcatÂed and unstanÂdardÂized. Task::Kensho is a big step in the right direcÂtion. More is needÂed. I’m not sure exactÂly what that would look like. Maybe an online community-​written verÂsion of the Perl Cookbook (the secÂond ediÂtion of which is unforÂtuÂnateÂly now many years old).
Loading…
FWIWMetaCPAN has rankÂings in the form of the ​“favorites” butÂton and the graph indiÂcatÂing a modÂule’s posiÂtion in the rivÂer of CPAN. Maybe they could be more obvious?
Loading…
I usuÂalÂly use a comÂbiÂnaÂtion of recent date, and popÂuÂlarÂiÂty [via numÂber of times favourÂitÂed, etc] to guide me.
Loading…
Thanks!
I am not seeÂing such a graph anyÂwhere on a modÂule’s page (e.g., CGI.pm).
Or a favorites button.
Could you elaborate?
Loading…
Loading…
Gawd. I have nevÂer noticed those. I’ve probÂaÂbly used metacÂpan hunÂdreds of times. THANKS, Mark.
Loading…
The probÂlem with IDEs is that peoÂple become LAZY. I can’t tell you the numÂber of times I’ve had to work on code develÂoped in an IDE, where the user either didÂn’t know how to conÂfigÂure the IDE to show warnÂings or explicÂitÂly conÂfigÂured it NOT to show warnings.
Consequently, I end up spendÂing the first few increÂments of time cleanÂing up all the warnÂings. Yes, I’m old school… NOTHING leaves my shop with with anyÂthing othÂer than debug info showÂing up in the logs or on a console.
Loading…
Comments are closed.
{"id":"11","mode":"button","open_style":"in_modal","currency_code":"USD","currency_symbol":"$","currency_type":"decimal","blank_flag_url":"https:\/\/phoenixtrap.com\/wp-content\/plugins\/tip-jar-wp\/\/assets\/images\/flags\/blank.gif","flag_sprite_url":"https:\/\/phoenixtrap.com\/wp-content\/plugins\/tip-jar-wp\/\/assets\/images\/flags\/flags.png","default_amount":500,"top_media_type":"featured_image","featured_image_url":"https:\/\/phoenixtrap.com\/wp-content\/uploads\/2021\/02\/image-200x200.jpg","featured_embed":"","header_media":null,"file_download_attachment_data":null,"recurring_options_enabled":true,"recurring_options":{"never":{"selected":true,"after_output":"One time only"},"weekly":{"selected":false,"after_output":"Every week"},"monthly":{"selected":false,"after_output":"Every month"},"yearly":{"selected":false,"after_output":"Every year"}},"strings":{"current_user_email":"","current_user_name":"","link_text":"Leave a tip!","complete_payment_button_error_text":"Check info and try again","payment_verb":"Pay","payment_request_label":"The Phoenix Trap","form_has_an_error":"Please check and fix the errors above","general_server_error":"Something isn't working right at the moment. Please try again.","form_title":"The Phoenix Trap","form_subtitle":"Do you like what you see? Leave a one-time or recurring tip!","currency_search_text":"Country or Currency here","other_payment_option":"Other payment option","manage_payments_button_text":"Manage your payments","thank_you_message":"Thank you for being a supporter!","payment_confirmation_title":"The Phoenix Trap","receipt_title":"Your Receipt","print_receipt":"Print Receipt","email_receipt":"Email Receipt","email_receipt_sending":"Sending receipt...","email_receipt_success":"Email receipt successfully sent","email_receipt_failed":"Email receipt failed to send. Please try again.","receipt_payee":"Paid to","receipt_statement_descriptor":"This will show up on your statement as","receipt_date":"Date","receipt_transaction_id":"Transaction ID","receipt_transaction_amount":"Amount","refund_payer":"Refund from","login":"Log in to manage your payments","manage_payments":"Manage Payments","transactions_title":"Your Transactions","transaction_title":"Transaction Receipt","transaction_period":"Plan Period","arrangements_title":"Your Plans","arrangement_title":"Manage Plan","arrangement_details":"Plan Details","arrangement_id_title":"Plan ID","arrangement_payment_method_title":"Payment Method","arrangement_amount_title":"Plan Amount","arrangement_renewal_title":"Next renewal date","arrangement_action_cancel":"Cancel Plan","arrangement_action_cant_cancel":"Cancelling is currently not available.","arrangement_action_cancel_double":"Are you sure you'd like to cancel?","arrangement_cancelling":"Cancelling Plan...","arrangement_cancelled":"Plan Cancelled","arrangement_failed_to_cancel":"Failed to cancel plan","back_to_plans":"\u2190 Back to Plans","update_payment_method_verb":"Update","sca_auth_description":"Your have a pending renewal payment which requires authorization.","sca_auth_verb":"Authorize renewal payment","sca_authing_verb":"Authorizing payment","sca_authed_verb":"Payment successfully authorized!","sca_auth_failed":"Unable to authorize! Please try again.","login_button_text":"Log in","login_form_has_an_error":"Please check and fix the errors above","uppercase_search":"Search","lowercase_search":"search","uppercase_page":"Page","lowercase_page":"page","uppercase_items":"Items","lowercase_items":"items","uppercase_per":"Per","lowercase_per":"per","uppercase_of":"Of","lowercase_of":"of","back":"Back to plans","zip_code_placeholder":"Zip\/Postal Code","download_file_button_text":"Download File","input_field_instructions":{"tip_amount":{"placeholder_text":"How much would you like to tip?","initial":{"instruction_type":"normal","instruction_message":"How much would you like to tip? Choose any currency."},"empty":{"instruction_type":"error","instruction_message":"How much would you like to tip? Choose any currency."},"invalid_curency":{"instruction_type":"error","instruction_message":"Please choose a valid currency."}},"recurring":{"placeholder_text":"Recurring","initial":{"instruction_type":"normal","instruction_message":"How often would you like to give this?"},"success":{"instruction_type":"success","instruction_message":"How often would you like to give this?"},"empty":{"instruction_type":"error","instruction_message":"How often would you like to give this?"}},"name":{"placeholder_text":"Name on Credit Card","initial":{"instruction_type":"normal","instruction_message":"What is the name on your credit card?"},"success":{"instruction_type":"success","instruction_message":"Enter the name on your card."},"empty":{"instruction_type":"error","instruction_message":"Please enter the name on your card."}},"privacy_policy":{"terms_title":"Terms and conditions","terms_body":null,"terms_show_text":"View Terms","terms_hide_text":"Hide Terms","initial":{"instruction_type":"normal","instruction_message":"I agree to the terms."},"unchecked":{"instruction_type":"error","instruction_message":"Please agree to the terms."},"checked":{"instruction_type":"success","instruction_message":"I agree to the terms."}},"email":{"placeholder_text":"Your email address","initial":{"instruction_type":"normal","instruction_message":"What is your email address?"},"success":{"instruction_type":"success","instruction_message":"Enter your email address"},"blank":{"instruction_type":"error","instruction_message":"Enter your email address"},"not_an_email_address":{"instruction_type":"error","instruction_message":"Make sure you have entered a valid email address"}},"note_with_tip":{"placeholder_text":"Your note here...","initial":{"instruction_type":"normal","instruction_message":"Attach a note to your tip (optional)"},"empty":{"instruction_type":"normal","instruction_message":"Attach a note to your tip (optional)"},"not_empty_initial":{"instruction_type":"normal","instruction_message":"Attach a note to your tip (optional)"},"saving":{"instruction_type":"normal","instruction_message":"Saving note..."},"success":{"instruction_type":"success","instruction_message":"Note successfully saved!"},"error":{"instruction_type":"error","instruction_message":"Unable to save note note at this time. Please try again."}},"email_for_login_code":{"placeholder_text":"Your email address","initial":{"instruction_type":"normal","instruction_message":"Enter your email to log in."},"success":{"instruction_type":"success","instruction_message":"Enter your email to log in."},"blank":{"instruction_type":"error","instruction_message":"Enter your email to log in."},"empty":{"instruction_type":"error","instruction_message":"Enter your email to log in."}},"login_code":{"initial":{"instruction_type":"normal","instruction_message":"Check your email and enter the login code."},"success":{"instruction_type":"success","instruction_message":"Check your email and enter the login code."},"blank":{"instruction_type":"error","instruction_message":"Check your email and enter the login code."},"empty":{"instruction_type":"error","instruction_message":"Check your email and enter the login code."}},"stripe_all_in_one":{"initial":{"instruction_type":"normal","instruction_message":"Enter your credit card details here."},"empty":{"instruction_type":"error","instruction_message":"Enter your credit card details here."},"success":{"instruction_type":"normal","instruction_message":"Enter your credit card details here."},"invalid_number":{"instruction_type":"error","instruction_message":"The card number is not a valid credit card number."},"invalid_expiry_month":{"instruction_type":"error","instruction_message":"The card's expiration month is invalid."},"invalid_expiry_year":{"instruction_type":"error","instruction_message":"The card's expiration year is invalid."},"invalid_cvc":{"instruction_type":"error","instruction_message":"The card's security code is invalid."},"incorrect_number":{"instruction_type":"error","instruction_message":"The card number is incorrect."},"incomplete_number":{"instruction_type":"error","instruction_message":"The card number is incomplete."},"incomplete_cvc":{"instruction_type":"error","instruction_message":"The card's security code is incomplete."},"incomplete_expiry":{"instruction_type":"error","instruction_message":"The card's expiration date is incomplete."},"incomplete_zip":{"instruction_type":"error","instruction_message":"The card's zip code is incomplete."},"expired_card":{"instruction_type":"error","instruction_message":"The card has expired."},"incorrect_cvc":{"instruction_type":"error","instruction_message":"The card's security code is incorrect."},"incorrect_zip":{"instruction_type":"error","instruction_message":"The card's zip code failed validation."},"invalid_expiry_year_past":{"instruction_type":"error","instruction_message":"The card's expiration year is in the past"},"card_declined":{"instruction_type":"error","instruction_message":"The card was declined."},"missing":{"instruction_type":"error","instruction_message":"There is no card on a customer that is being charged."},"processing_error":{"instruction_type":"error","instruction_message":"An error occurred while processing the card."},"invalid_request_error":{"instruction_type":"error","instruction_message":"Unable to process this payment, please try again or use alternative method."},"invalid_sofort_country":{"instruction_type":"error","instruction_message":"The billing country is not accepted by SOFORT. Please try another country."}}}},"fetched_oembed_html":false}
Good food for thought!
I sure hope so!
Mark, someÂwhat relatÂed to ​“senÂsiÂble defaults” is the way there basiÂcalÂly is no easy way to wade through thouÂsands and thouÂsands of CPAN modÂules, many of which are crufty, in order to deterÂmine which modÂule proÂvides the best soluÂtion for a parÂticÂuÂlar probÂlem. The size of CPAN and lack of rankÂings or some sort of ​“best pracÂtices” guide to them is a liaÂbilÂiÂty in a sense, because it makes Perl as a lanÂguage feel comÂpliÂcatÂed and unstanÂdardÂized. Task::Kensho is a big step in the right direcÂtion. More is needÂed. I’m not sure exactÂly what that would look like. Maybe an online community-​written verÂsion of the Perl Cookbook (the secÂond ediÂtion of which is unforÂtuÂnateÂly now many years old).
FWIW MetaCPAN has rankÂings in the form of the ​“favorites” butÂton and the graph indiÂcatÂing a modÂule’s posiÂtion in the rivÂer of CPAN. Maybe they could be more obvious?
I usuÂalÂly use a comÂbiÂnaÂtion of recent date, and popÂuÂlarÂiÂty [via numÂber of times favourÂitÂed, etc] to guide me.
Thanks!
I am not seeÂing such a graph anyÂwhere on a modÂule’s page (e.g., CGI.pm).
Or a favorites button.
Could you elaborate?
Gawd. I have nevÂer noticed those. I’ve probÂaÂbly used metacÂpan hunÂdreds of times. THANKS, Mark.
The probÂlem with IDEs is that peoÂple become LAZY. I can’t tell you the numÂber of times I’ve had to work on code develÂoped in an IDE, where the user either didÂn’t know how to conÂfigÂure the IDE to show warnÂings or explicÂitÂly conÂfigÂured it NOT to show warnings.
Consequently, I end up spendÂing the first few increÂments of time cleanÂing up all the warnÂings. Yes, I’m old school… NOTHING leaves my shop with with anyÂthing othÂer than debug info showÂing up in the logs or on a console.