[{"data":1,"prerenderedAt":2115},["ShallowReactive",2],{"blog-whygolang":3},{"id":4,"title":5,"body":6,"date":2102,"description":2103,"extension":2104,"featured":239,"meta":2105,"navigation":239,"path":2106,"seo":2107,"stem":2108,"tags":2109,"__hash__":2114},"blog\u002Fblog\u002Fwhygolang.md","Why I Use Go (Instead of Python, R, or VBA)",{"type":7,"value":8,"toc":2083},"minimark",[9,27,32,76,109,113,118,139,377,398,402,430,537,558,562,575,643,652,656,671,761,783,796,800,842,1099,1110,1114,1277,1281,1356,1360,1376,1448,1452,1490,1494,1540,1544,1547,1887,1891,1942,1946,1961,2003,2017,2032,2050,2057,2061,2079],[10,11,12],"blockquote",{},[13,14,15,19,20],"p",{},[16,17,18],"strong",{},"From spreadsheets to simulations"," — a personal take on modern actuarial programming that'll make you question everything you thought you knew about ",[21,22,26],"a",{"href":23,"rel":24},"https:\u002F\u002Fblog.actuaries.org.uk\u002Freaching-actuary-3-point-0\u002F",[25],"nofollow","actuarial education",[28,29,31],"h2",{"id":30},"backstory-from-formulas-to-functions-and-my-sanity","Backstory: From Formulas to Functions (And My Sanity)",[13,33,34,35,38,39,42,43,46,47,51,52,57,58,63,64,69,70,75],{},"In actuarial science, we're often trained to live in ",[16,36,37],{},"spreadsheets",", ",[16,40,41],{},"scripting languages",", and ",[16,44,45],{},"statistical software"," that makes you want to throw your laptop out the window. I've written ",[48,49,50],"em",{},"thousands"," of formulas in ",[21,53,56],{"href":54,"rel":55},"https:\u002F\u002Fsupport.microsoft.com\u002Fen-us\u002Foffice\u002Fexcel-functions-alphabetical-b3944572-255d-4efb-bb96-c6d90033e188",[25],"Excel",", built models in ",[21,59,62],{"href":60,"rel":61},"https:\u002F\u002Fwww.r-project.org\u002F",[25],"R"," that crashed mysteriously, and debugged ",[21,65,68],{"href":66,"rel":67},"https:\u002F\u002Fnumpy.org\u002F",[25],"NumPy"," code in ",[21,71,74],{"href":72,"rel":73},"https:\u002F\u002Fjupyter.org\u002F",[25],"Jupyter notebooks"," until 3 AM. But when I started building actual systems — not just models that work \"most of the time\" — those tools fell short.",[13,77,78,79,82,83,38,86,38,89,92,93,96,97,102,103,108],{},"That's where I started exploring ",[16,80,81],{},"Go"," (aka Golang). A language that's ",[48,84,85],{},"blazing fast",[48,87,88],{},"beautifully structured",[48,90,91],{},"compiled to perfection",", and surprisingly ",[16,94,95],{},"simple"," (unlike my relationship with R's error messages). Over time, it became my main tool for building actuarial applications — from ",[21,98,101],{"href":99,"rel":100},"https:\u002F\u002Factuworry.onrender.com",[25],"Actuworry"," (an open-source reserving simulator that doesn't make you cry) to tools for ",[21,104,107],{"href":105,"rel":106},"https:\u002F\u002Fwww.investopedia.com\u002Fterms\u002Fl\u002Flifeinsurance.asp",[25],"life insurance pricing"," and strategy modeling.",[28,110,112],{"id":111},"why-go-a-practical-case-for-students-actuaries-quants-data-folks","Why Go? (A Practical Case for Students, Actuaries, Quants & Data Folks)",[114,115,117],"h3",{"id":116},"_1-go-is-fast-like-really-fast","1. Go Is Fast — Like, Really Fast",[13,119,120,121,124,125,128,129,132,133,138],{},"Go compiles to ",[16,122,123],{},"native machine code",". That means simulations that take ",[48,126,127],{},"minutes"," in Python or ",[48,130,131],{},"hours"," in R run in seconds with Go. There's no interpreter overhead, no ",[21,134,137],{"href":135,"rel":136},"https:\u002F\u002Fdocs.python.org\u002F3\u002Fglossary.html#term-global-interpreter-lock",[25],"GIL bottleneck",", or hidden type coercion surprises that make you question your life choices.",[140,141,146],"pre",{"className":142,"code":143,"language":144,"meta":145,"style":145},"language-go shiki shiki-themes vesper","\u002F\u002F Go: Monte Carlo simulation snippet\nfunc runSimulation(policies []Policy, scenarios int) []Result {\n    results := make([]Result, len(policies))\n    var wg sync.WaitGroup\n\n    for i, policy := range policies {\n        wg.Add(1)\n        go func(p Policy, idx int) {\n            defer wg.Done()\n            results[idx] = simulatePolicy(p, scenarios)\n        }(policy, i)\n    }\n\n    wg.Wait()\n    return results\n}\n\u002F\u002F This runs in parallel. Effortlessly. No drama.\n","go","",[147,148,149,158,191,216,234,241,258,276,298,313,328,334,340,345,356,365,371],"code",{"__ignoreMap":145},[150,151,154],"span",{"class":152,"line":153},"line",1,[150,155,157],{"class":156},"ss8vJ","\u002F\u002F Go: Monte Carlo simulation snippet\n",[150,159,161,165,169,173,176,179,182,185,188],{"class":152,"line":160},2,[150,162,164],{"class":163},"sq0yK","func",[150,166,168],{"class":167},"sNEDb"," runSimulation",[150,170,172],{"class":171},"sU-n2","(policies []",[150,174,175],{"class":167},"Policy",[150,177,178],{"class":171},", scenarios ",[150,180,181],{"class":163},"int",[150,183,184],{"class":171},") []",[150,186,187],{"class":167},"Result",[150,189,190],{"class":171}," {\n",[150,192,194,197,200,203,206,208,210,213],{"class":152,"line":193},3,[150,195,196],{"class":171},"    results ",[150,198,199],{"class":163},":=",[150,201,202],{"class":167}," make",[150,204,205],{"class":171},"([]",[150,207,187],{"class":167},[150,209,38],{"class":171},[150,211,212],{"class":167},"len",[150,214,215],{"class":171},"(policies))\n",[150,217,219,222,225,228,231],{"class":152,"line":218},4,[150,220,221],{"class":163},"    var",[150,223,224],{"class":171}," wg ",[150,226,227],{"class":167},"sync",[150,229,230],{"class":171},".",[150,232,233],{"class":167},"WaitGroup\n",[150,235,237],{"class":152,"line":236},5,[150,238,240],{"emptyLinePlaceholder":239},true,"\n",[150,242,244,247,250,252,255],{"class":152,"line":243},6,[150,245,246],{"class":163},"    for",[150,248,249],{"class":171}," i, policy ",[150,251,199],{"class":163},[150,253,254],{"class":163}," range",[150,256,257],{"class":171}," policies {\n",[150,259,261,264,267,270,273],{"class":152,"line":260},7,[150,262,263],{"class":171},"        wg.",[150,265,266],{"class":167},"Add",[150,268,269],{"class":171},"(",[150,271,272],{"class":167},"1",[150,274,275],{"class":171},")\n",[150,277,279,282,285,288,290,293,295],{"class":152,"line":278},8,[150,280,281],{"class":163},"        go",[150,283,284],{"class":163}," func",[150,286,287],{"class":171},"(p ",[150,289,175],{"class":167},[150,291,292],{"class":171},", idx ",[150,294,181],{"class":163},[150,296,297],{"class":171},") {\n",[150,299,301,304,307,310],{"class":152,"line":300},9,[150,302,303],{"class":163},"            defer",[150,305,306],{"class":171}," wg.",[150,308,309],{"class":167},"Done",[150,311,312],{"class":171},"()\n",[150,314,316,319,322,325],{"class":152,"line":315},10,[150,317,318],{"class":171},"            results[idx] ",[150,320,321],{"class":163},"=",[150,323,324],{"class":167}," simulatePolicy",[150,326,327],{"class":171},"(p, scenarios)\n",[150,329,331],{"class":152,"line":330},11,[150,332,333],{"class":171},"        }(policy, i)\n",[150,335,337],{"class":152,"line":336},12,[150,338,339],{"class":171},"    }\n",[150,341,343],{"class":152,"line":342},13,[150,344,240],{"emptyLinePlaceholder":239},[150,346,348,351,354],{"class":152,"line":347},14,[150,349,350],{"class":171},"    wg.",[150,352,353],{"class":167},"Wait",[150,355,312],{"class":171},[150,357,359,362],{"class":152,"line":358},15,[150,360,361],{"class":163},"    return",[150,363,364],{"class":171}," results\n",[150,366,368],{"class":152,"line":367},16,[150,369,370],{"class":171},"}\n",[150,372,374],{"class":152,"line":373},17,[150,375,376],{"class":156},"\u002F\u002F This runs in parallel. Effortlessly. No drama.\n",[13,378,379,380,383,384,389,390,393,394,397],{},"In one reserving prototype, my Go version ran ",[16,381,382],{},"as fast"," as the Python equivalent using ",[21,385,388],{"href":386,"rel":387},"https:\u002F\u002Fpandas.pydata.org\u002F",[25],"pandas"," and ",[21,391,68],{"href":66,"rel":392},[25],". NumPy is written in C and C++ so you know it's fast. And it used ",[48,395,396],{},"less memory",". And I didn't have to install 47 dependencies. And it didn't break when I looked at it wrong.",[114,399,401],{"id":400},"_2-concurrency-made-simple-finally","2. Concurrency Made Simple (Finally!)",[13,403,404,405,408,409,414,415,389,420,425,426,429],{},"Need to simulate ",[16,406,407],{},"10,000 policy paths","? Or run ",[21,410,413],{"href":411,"rel":412},"https:\u002F\u002Fwww.investopedia.com\u002Fterms\u002Fs\u002Fstresstesting.asp",[25],"stress testing"," across assumption sets that would make a CPU weep? Go's ",[21,416,419],{"href":417,"rel":418},"https:\u002F\u002Fgo.dev\u002Fdoc\u002Feffective_go#goroutines",[25],"goroutines",[21,421,424],{"href":422,"rel":423},"https:\u002F\u002Fgo.dev\u002Fdoc\u002Feffective_go#channels",[25],"channels"," make concurrent code readable and ",[48,427,428],{},"powerful"," without requiring a degree in computer science.",[140,431,433],{"className":142,"code":432,"language":144,"meta":145,"style":145},"\u002F\u002F Want to run something concurrently in Go?\ngo calculateReserves(policyBatch)\n\n\u002F\u002F That's it. Seriously. That's the whole thing.\n\u002F\u002F Compare this to Python's multiprocessing hell:\n\n# Python concurrent code (prepare for pain)\nfrom multiprocessing import Pool, Queue, Process\nimport threading\n# ... 47 more lines of setup code\n# ... error handling for when it inevitably breaks\n# ... crying\n",[147,434,435,440,450,454,459,464,468,479,490,497,511,528],{"__ignoreMap":145},[150,436,437],{"class":152,"line":153},[150,438,439],{"class":156},"\u002F\u002F Want to run something concurrently in Go?\n",[150,441,442,444,447],{"class":152,"line":160},[150,443,144],{"class":163},[150,445,446],{"class":167}," calculateReserves",[150,448,449],{"class":171},"(policyBatch)\n",[150,451,452],{"class":152,"line":193},[150,453,240],{"emptyLinePlaceholder":239},[150,455,456],{"class":152,"line":218},[150,457,458],{"class":156},"\u002F\u002F That's it. Seriously. That's the whole thing.\n",[150,460,461],{"class":152,"line":236},[150,462,463],{"class":156},"\u002F\u002F Compare this to Python's multiprocessing hell:\n",[150,465,466],{"class":152,"line":243},[150,467,240],{"emptyLinePlaceholder":239},[150,469,470,473,476],{"class":152,"line":260},[150,471,472],{"class":171},"# Python concurrent code (prepare ",[150,474,475],{"class":163},"for",[150,477,478],{"class":171}," pain)\n",[150,480,481,484,487],{"class":152,"line":278},[150,482,483],{"class":171},"from multiprocessing ",[150,485,486],{"class":163},"import",[150,488,489],{"class":171}," Pool, Queue, Process\n",[150,491,492,494],{"class":152,"line":300},[150,493,486],{"class":163},[150,495,496],{"class":171}," threading\n",[150,498,499,502,505,508],{"class":152,"line":315},[150,500,501],{"class":171},"# ",[150,503,504],{"class":163},"...",[150,506,507],{"class":167}," 47",[150,509,510],{"class":171}," more lines of setup code\n",[150,512,513,515,517,520,523,525],{"class":152,"line":330},[150,514,501],{"class":171},[150,516,504],{"class":163},[150,518,519],{"class":163}," error",[150,521,522],{"class":171}," handling ",[150,524,475],{"class":163},[150,526,527],{"class":171}," when it inevitably breaks\n",[150,529,530,532,534],{"class":152,"line":336},[150,531,501],{"class":171},[150,533,504],{"class":163},[150,535,536],{"class":171}," crying\n",[13,538,539,540,38,543,546,547,550,551,554,555],{},"In Python, you'd need ",[147,541,542],{},"multiprocessing",[147,544,545],{},"asyncio",", or a framework. In R, you'd probably give up and go get a coffee. In Go, it's just ",[147,548,549],{},"go someFunc()",". ",[16,552,553],{},"That's it."," ",[48,556,557],{},"That's the end.",[114,559,561],{"id":560},"_3-one-binary-no-drama-deployment-in-heaven","3. One Binary, No Drama (Deployment in Heaven)",[13,563,564,565,570,571,574],{},"Remember fighting with ",[21,566,569],{"href":567,"rel":568},"https:\u002F\u002Fdocs.python.org\u002F3\u002Ftutorial\u002Fvenv.html",[25],"virtual environments","? Or ",[147,572,573],{},"pip install"," errors that made you question reality? Or R package version mismatches that sent you into therapy? Or explaining to your boss why the model works on your machine but not theirs?",[140,576,580],{"className":577,"code":578,"language":579,"meta":145,"style":145},"language-bash shiki shiki-themes vesper","# The Python deployment experience:\npip install -r requirements.txt\n# Error: package X conflicts with Y\n# Error: Python version mismatch\n# Error: your computer is cursed\n# Error: have you tried turning it off and on again?\n\n# The Go deployment experience:\ngo build\n# Done. Ship it.\n","bash",[147,581,582,587,602,607,612,617,622,626,631,638],{"__ignoreMap":145},[150,583,584],{"class":152,"line":153},[150,585,586],{"class":156},"# The Python deployment experience:\n",[150,588,589,592,596,599],{"class":152,"line":160},[150,590,591],{"class":167},"pip",[150,593,595],{"class":594},"sZOz5"," install",[150,597,598],{"class":594}," -r",[150,600,601],{"class":594}," requirements.txt\n",[150,603,604],{"class":152,"line":193},[150,605,606],{"class":156},"# Error: package X conflicts with Y\n",[150,608,609],{"class":152,"line":218},[150,610,611],{"class":156},"# Error: Python version mismatch\n",[150,613,614],{"class":152,"line":236},[150,615,616],{"class":156},"# Error: your computer is cursed\n",[150,618,619],{"class":152,"line":243},[150,620,621],{"class":156},"# Error: have you tried turning it off and on again?\n",[150,623,624],{"class":152,"line":260},[150,625,240],{"emptyLinePlaceholder":239},[150,627,628],{"class":152,"line":278},[150,629,630],{"class":156},"# The Go deployment experience:\n",[150,632,633,635],{"class":152,"line":300},[150,634,144],{"class":167},[150,636,637],{"class":594}," build\n",[150,639,640],{"class":152,"line":315},[150,641,642],{"class":156},"# Done. Ship it.\n",[13,644,645,646,651],{},"With Go, I compile my app into a single static binary. I can send it to anyone — no runtime needed. No dependencies. No excuses. No \"works on my machine\" syndrome. This makes it perfect for production-grade simulations, internal tools, and even ",[21,647,650],{"href":648,"rel":649},"https:\u002F\u002Fgithub.com\u002Fgorilla\u002Fmux",[25],"actuarial APIs"," that don't make your Dev team cry.",[114,653,655],{"id":654},"_4-clean-code-strong-types-type-safety-mental-safety","4. Clean Code, Strong Types (Type Safety = Mental Safety)",[13,657,658,659,666,667,670],{},"Go is ",[16,660,661],{},[21,662,665],{"href":663,"rel":664},"https:\u002F\u002Fgo.dev\u002Fdoc\u002Feffective_go#types",[25],"statically typed",", which catches many bugs at ",[48,668,669],{},"compile time"," instead of during your 3-hour Monte Carlo simulation. It encourages you to write clear, testable, and maintainable code that doesn't make future-you want to time-travel back and slap present-you.",[140,672,674],{"className":142,"code":673,"language":144,"meta":145,"style":145},"\u002F\u002F Go catches this at compile time:\nfunc calculatePremium(age string, amount float64) float64 {\n    return age * amount \u002F\u002F ERROR: can't multiply string by float64\n}\n\n\u002F\u002F Python lets this explode at runtime:\ndef calculate_premium(age, amount):\n    return age * amount  # Hope and pray age is a number!\n",[147,675,676,681,707,723,727,731,736,747],{"__ignoreMap":145},[150,677,678],{"class":152,"line":153},[150,679,680],{"class":156},"\u002F\u002F Go catches this at compile time:\n",[150,682,683,685,688,691,694,697,700,703,705],{"class":152,"line":160},[150,684,164],{"class":163},[150,686,687],{"class":167}," calculatePremium",[150,689,690],{"class":171},"(age ",[150,692,693],{"class":163},"string",[150,695,696],{"class":171},", amount ",[150,698,699],{"class":163},"float64",[150,701,702],{"class":171},") ",[150,704,699],{"class":163},[150,706,190],{"class":171},[150,708,709,711,714,717,720],{"class":152,"line":193},[150,710,361],{"class":163},[150,712,713],{"class":171}," age ",[150,715,716],{"class":163},"*",[150,718,719],{"class":171}," amount ",[150,721,722],{"class":156},"\u002F\u002F ERROR: can't multiply string by float64\n",[150,724,725],{"class":152,"line":218},[150,726,370],{"class":171},[150,728,729],{"class":152,"line":236},[150,730,240],{"emptyLinePlaceholder":239},[150,732,733],{"class":152,"line":243},[150,734,735],{"class":156},"\u002F\u002F Python lets this explode at runtime:\n",[150,737,738,741,744],{"class":152,"line":260},[150,739,740],{"class":171},"def ",[150,742,743],{"class":167},"calculate_premium",[150,745,746],{"class":171},"(age, amount):\n",[150,748,749,751,753,755,758],{"class":152,"line":278},[150,750,361],{"class":163},[150,752,713],{"class":171},[150,754,716],{"class":163},[150,756,757],{"class":171}," amount  # Hope and pray age is a number",[150,759,760],{"class":163},"!\n",[13,762,763,764,769,770,773,774,38,777,42,780,230],{},"No ",[21,765,768],{"href":766,"rel":767},"https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FDuck_typing",[25],"duck typing"," surprises. No ",[147,771,772],{},"undefined"," errors halfway through a 3-hour simulation. It'll tell you you're wrong ",[48,775,776],{},"early",[48,778,779],{},"loudly",[48,781,782],{},"helpfully",[13,784,785,786,38,789,42,792,795],{},"And tools like ",[147,787,788],{},"go test",[147,790,791],{},"go fmt",[147,793,794],{},"go mod tidy"," are built in. You don't need to install linters, formatters, or dependency managers. Go handles that out of the box like a responsible adult.",[114,797,799],{"id":798},"_5-strong-standard-library-batteries-actually-included","5. Strong Standard Library (Batteries Actually Included)",[13,801,802,803,810,811,38,816,38,821,38,826,38,831,38,836,841],{},"Go's ",[16,804,805],{},[21,806,809],{"href":807,"rel":808},"https:\u002F\u002Fpkg.go.dev\u002Fstd",[25],"standard library"," covers almost everything I need: ",[21,812,815],{"href":813,"rel":814},"https:\u002F\u002Fpkg.go.dev\u002Fmath",[25],"math",[21,817,820],{"href":818,"rel":819},"https:\u002F\u002Fpkg.go.dev\u002Fos",[25],"file I\u002FO",[21,822,825],{"href":823,"rel":824},"https:\u002F\u002Fpkg.go.dev\u002Fnet\u002Fhttp",[25],"HTTP servers",[21,827,830],{"href":828,"rel":829},"https:\u002F\u002Fpkg.go.dev\u002Fencoding\u002Fjson",[25],"JSON encoding",[21,832,835],{"href":833,"rel":834},"https:\u002F\u002Fpkg.go.dev\u002Fcrypto",[25],"cryptography",[21,837,840],{"href":838,"rel":839},"https:\u002F\u002Fpkg.go.dev\u002Ftime",[25],"time handling"," — all baked in and ready to rock.",[140,843,845],{"className":142,"code":844,"language":144,"meta":145,"style":145},"\u002F\u002F Need an HTTP server for your actuarial API?\npackage main\n\nimport (\n    \"encoding\u002Fjson\"\n    \"net\u002Fhttp\"\n)\n\ntype Premium struct {\n    Age    int     `json:\"age\"`\n    Amount float64 `json:\"amount\"`\n    Rate   float64 `json:\"rate\"`\n}\n\nfunc calculateHandler(w http.ResponseWriter, r *http.Request) {\n    \u002F\u002F Your actuarial logic here\n    premium := Premium{Age: 35, Amount: 100000, Rate: 0.05}\n    json.NewEncoder(w).Encode(premium)\n}\n\nfunc main() {\n    http.HandleFunc(\"\u002Fcalculate\", calculateHandler)\n    http.ListenAndServe(\":8080\", nil)\n}\n\u002F\u002F That's a working web server. No Flask. No Django. No tears.\n",[147,846,847,852,860,864,871,882,891,895,899,912,922,932,942,946,950,982,987,1016,1034,1039,1044,1055,1072,1088,1093],{"__ignoreMap":145},[150,848,849],{"class":152,"line":153},[150,850,851],{"class":156},"\u002F\u002F Need an HTTP server for your actuarial API?\n",[150,853,854,857],{"class":152,"line":160},[150,855,856],{"class":163},"package",[150,858,859],{"class":167}," main\n",[150,861,862],{"class":152,"line":193},[150,863,240],{"emptyLinePlaceholder":239},[150,865,866,868],{"class":152,"line":218},[150,867,486],{"class":163},[150,869,870],{"class":171}," (\n",[150,872,873,876,879],{"class":152,"line":236},[150,874,875],{"class":594},"    \"",[150,877,878],{"class":167},"encoding\u002Fjson",[150,880,881],{"class":594},"\"\n",[150,883,884,886,889],{"class":152,"line":243},[150,885,875],{"class":594},[150,887,888],{"class":167},"net\u002Fhttp",[150,890,881],{"class":594},[150,892,893],{"class":152,"line":260},[150,894,275],{"class":171},[150,896,897],{"class":152,"line":278},[150,898,240],{"emptyLinePlaceholder":239},[150,900,901,904,907,910],{"class":152,"line":300},[150,902,903],{"class":163},"type",[150,905,906],{"class":167}," Premium",[150,908,909],{"class":163}," struct",[150,911,190],{"class":171},[150,913,914,917,919],{"class":152,"line":315},[150,915,916],{"class":171},"    Age    ",[150,918,181],{"class":163},[150,920,921],{"class":594},"     `json:\"age\"`\n",[150,923,924,927,929],{"class":152,"line":330},[150,925,926],{"class":171},"    Amount ",[150,928,699],{"class":163},[150,930,931],{"class":594}," `json:\"amount\"`\n",[150,933,934,937,939],{"class":152,"line":336},[150,935,936],{"class":171},"    Rate   ",[150,938,699],{"class":163},[150,940,941],{"class":594}," `json:\"rate\"`\n",[150,943,944],{"class":152,"line":342},[150,945,370],{"class":171},[150,947,948],{"class":152,"line":347},[150,949,240],{"emptyLinePlaceholder":239},[150,951,952,954,957,960,963,965,968,971,973,975,977,980],{"class":152,"line":358},[150,953,164],{"class":163},[150,955,956],{"class":167}," calculateHandler",[150,958,959],{"class":171},"(w ",[150,961,962],{"class":167},"http",[150,964,230],{"class":171},[150,966,967],{"class":167},"ResponseWriter",[150,969,970],{"class":171},", r ",[150,972,716],{"class":163},[150,974,962],{"class":167},[150,976,230],{"class":171},[150,978,979],{"class":167},"Request",[150,981,297],{"class":171},[150,983,984],{"class":152,"line":367},[150,985,986],{"class":156},"    \u002F\u002F Your actuarial logic here\n",[150,988,989,992,994,996,999,1002,1005,1008,1011,1014],{"class":152,"line":373},[150,990,991],{"class":171},"    premium ",[150,993,199],{"class":163},[150,995,906],{"class":167},[150,997,998],{"class":171},"{Age: ",[150,1000,1001],{"class":167},"35",[150,1003,1004],{"class":171},", Amount: ",[150,1006,1007],{"class":167},"100000",[150,1009,1010],{"class":171},", Rate: ",[150,1012,1013],{"class":167},"0.05",[150,1015,370],{"class":171},[150,1017,1019,1022,1025,1028,1031],{"class":152,"line":1018},18,[150,1020,1021],{"class":171},"    json.",[150,1023,1024],{"class":167},"NewEncoder",[150,1026,1027],{"class":171},"(w).",[150,1029,1030],{"class":167},"Encode",[150,1032,1033],{"class":171},"(premium)\n",[150,1035,1037],{"class":152,"line":1036},19,[150,1038,370],{"class":171},[150,1040,1042],{"class":152,"line":1041},20,[150,1043,240],{"emptyLinePlaceholder":239},[150,1045,1047,1049,1052],{"class":152,"line":1046},21,[150,1048,164],{"class":163},[150,1050,1051],{"class":167}," main",[150,1053,1054],{"class":171},"() {\n",[150,1056,1058,1061,1064,1066,1069],{"class":152,"line":1057},22,[150,1059,1060],{"class":171},"    http.",[150,1062,1063],{"class":167},"HandleFunc",[150,1065,269],{"class":171},[150,1067,1068],{"class":594},"\"\u002Fcalculate\"",[150,1070,1071],{"class":171},", calculateHandler)\n",[150,1073,1075,1077,1080,1082,1085],{"class":152,"line":1074},23,[150,1076,1060],{"class":171},[150,1078,1079],{"class":167},"ListenAndServe",[150,1081,269],{"class":171},[150,1083,1084],{"class":594},"\":8080\"",[150,1086,1087],{"class":171},", nil)\n",[150,1089,1091],{"class":152,"line":1090},24,[150,1092,370],{"class":171},[150,1094,1096],{"class":152,"line":1095},25,[150,1097,1098],{"class":156},"\u002F\u002F That's a working web server. No Flask. No Django. No tears.\n",[13,1100,1101,1102,1105,1106,1109],{},"I rarely need third-party libraries. Compare that to Python or R, where your script starts with 10 lines of imports just to ",[48,1103,1104],{},"plot a graph"," or ",[48,1107,1108],{},"load a CSV"," without everything catching fire.",[28,1111,1113],{"id":1112},"technical-comparison-go-vs-python-vs-r","Technical Comparison (Go vs Python vs R)",[1115,1116,1117,1134],"table",{},[1118,1119,1120],"thead",{},[1121,1122,1123,1127,1129,1132],"tr",{},[1124,1125,1126],"th",{},"Feature",[1124,1128,81],{},[1124,1130,1131],{},"Python",[1124,1133,62],{},[1135,1136,1137,1158,1178,1200,1216,1237,1258],"tbody",{},[1121,1138,1139,1145,1152,1155],{},[1140,1141,1142],"td",{},[16,1143,1144],{},"Performance",[1140,1146,1147,1148],{},"Native, compiled, ",[21,1149,85],{"href":1150,"rel":1151},"https:\u002F\u002Fbenchmarksgame-team.pages.debian.net\u002Fbenchmarksgame\u002F",[25],[1140,1153,1154],{},"Interpreted, slower in loops",[1140,1156,1157],{},"Good for stats, limited elsewhere",[1121,1159,1160,1165,1172,1175],{},[1140,1161,1162],{},[16,1163,1164],{},"Typing",[1140,1166,1167],{},[21,1168,1171],{"href":1169,"rel":1170},"https:\u002F\u002Fgo.dev\u002Fref\u002Fspec#Types",[25],"Static, safe",[1140,1173,1174],{},"Dynamic, flexible",[1140,1176,1177],{},"Dynamic, vectorized",[1121,1179,1180,1185,1191,1197],{},[1140,1181,1182],{},[16,1183,1184],{},"Concurrency",[1140,1186,1187],{},[21,1188,1190],{"href":417,"rel":1189},[25],"Goroutines & channels",[1140,1192,1193],{},[21,1194,137],{"href":1195,"rel":1196},"https:\u002F\u002Fwiki.python.org\u002Fmoin\u002FGlobalInterpreterLock",[25],[1140,1198,1199],{},"Limited",[1121,1201,1202,1207,1210,1213],{},[1140,1203,1204],{},[16,1205,1206],{},"Deployment",[1140,1208,1209],{},"Single binary, zero dependencies",[1140,1211,1212],{},"Virtual env, Docker",[1140,1214,1215],{},"RStudio\u002FRscript dependency",[1121,1217,1218,1223,1231,1234],{},[1140,1219,1220],{},[16,1221,1222],{},"Ecosystem",[1140,1224,1225,1226],{},"Small but ",[21,1227,1230],{"href":1228,"rel":1229},"https:\u002F\u002Fpkg.go.dev\u002F",[25],"high-quality",[1140,1232,1233],{},"Massive, inconsistent",[1140,1235,1236],{},"Strong for stats",[1121,1238,1239,1244,1252,1255],{},[1140,1240,1241],{},[16,1242,1243],{},"Learning Curve",[1140,1245,1246,1247],{},"Simple, clean, ",[21,1248,1251],{"href":1249,"rel":1250},"https:\u002F\u002Ftour.golang.org\u002F",[25],"logical",[1140,1253,1254],{},"Easy start, complex later",[1140,1256,1257],{},"Stat-heavy",[1121,1259,1260,1265,1268,1271],{},[1140,1261,1262],{},[16,1263,1264],{},"Error Messages",[1140,1266,1267],{},"Clear, helpful, actionable",[1140,1269,1270],{},"Sometimes cryptic",[1140,1272,1273,1274,1276],{},"\"",[150,1275,272],{}," NA\" and mysteries",[28,1278,1280],{"id":1279},"language-roast-no-programming-language-is-safe","Language Roast (No Programming Language is Safe)",[1282,1283,1284,1302,1314,1326,1335,1344],"ul",{},[1285,1286,1287,554,1290,1293,1294,1298,1299,1301],"li",{},[16,1288,1289],{},"Python:",[48,1291,1292],{},"\"It's fast and simple… if you don't use loops, need concurrency, or care about deployment.\""," The ",[21,1295,1297],{"href":1195,"rel":1296},[25],"GIL"," and its speed on large-scale projects is a meme for a reason. Also, ",[147,1300,573],{}," errors are a form of psychological warfare.",[1285,1303,1304,554,1307,1313],{},[16,1305,1306],{},"R:",[48,1308,1309,1310,1312],{},"\"It works until you hit '",[150,1311,272],{}," NA' and spend 3 hours debugging what should be a simple calculation.\""," R is like that brilliant professor who explains calculus using interpretive dance — technically correct, practically useless.",[1285,1315,1316,554,1319,554,1322,1325],{},[16,1317,1318],{},"Rust:",[48,1320,1321],{},"\"You will write the most memory-safe actuarial tool ever — eventually, after sacrificing your firstborn to the borrow checker.\"",[147,1323,1324],{},"expected &str, found String"," — thanks, I hate it.",[1285,1327,1328,554,1331,1334],{},[16,1329,1330],{},"Zig:",[48,1332,1333],{},"\"The language that makes Go feel like a luxury sedan.\""," Great potential, but too early for production actuarial use.",[1285,1336,1337,554,1340,1343],{},[16,1338,1339],{},"VBA:",[48,1341,1342],{},"\"The language equivalent of using a spoon to dig a tunnel.\""," If you're still writing VBA in 2025, I'm calling an abuse hotline. Excel macros are not a career path, they're a cry for help.",[1285,1345,1346,554,1349,554,1352,1355],{},[16,1347,1348],{},"Java:",[48,1350,1351],{},"\"Enterprise-grade verbosity for when you want to write 50 lines of code to print 'Hello World'.\"",[147,1353,1354],{},"AbstractSingletonProxyFactoryBean"," is a real class name, not a joke.",[28,1357,1359],{"id":1358},"modern-language-suggestions-for-actuarial-workflows","Modern Language Suggestions for Actuarial Workflows",[13,1361,1362,1363,38,1365,38,1368,1371,1372,1375],{},"If you're still stuck in ",[16,1364,56],{},[16,1366,1367],{},"R purgatory",[16,1369,1370],{},"Python dependency limbo",", or ",[16,1373,1374],{},"VBA torture chamber",", here's a nudge toward exploring other options:",[1282,1377,1378,1394,1403,1415,1421,1431,1442],{},[1285,1379,1380,1383,1384,38,1389,1393],{},[16,1381,1382],{},"Go:"," For building pricing\u002Freserving engines, ",[21,1385,1388],{"href":1386,"rel":1387},"https:\u002F\u002Fgithub.com\u002Fspf13\u002Fcobra",[25],"CLI tools",[21,1390,1392],{"href":648,"rel":1391},[25],"APIs",", internal microservices",[1285,1395,1396,1398,1399,1402],{},[16,1397,1318],{}," For safe, high-performance actuarial engines when you need ",[48,1400,1401],{},"maximum"," control",[1285,1404,1405,1408,1409,1414],{},[16,1406,1407],{},"Julia:"," For numerical analysis, statistical models, and actuarial forecasting (it's like R but ",[21,1410,1413],{"href":1411,"rel":1412},"https:\u002F\u002Fjulialang.org\u002Fbenchmarks\u002F",[25],"actually fast",")",[1285,1416,1417,1420],{},[16,1418,1419],{},"Elixir:"," For real-time policy monitoring, data pipelines, and concurrent dashboards",[1285,1422,1423,1426,1427,1430],{},[16,1424,1425],{},"TypeScript"," + ",[16,1428,1429],{},"Vue:"," For building modern interfaces for internal actuarial tools",[1285,1432,1433,1436,1437],{},[16,1434,1435],{},"Scala:"," If you're in a bank and forced to use ",[21,1438,1441],{"href":1439,"rel":1440},"https:\u002F\u002Fspark.apache.org\u002F",[25],"Spark",[1285,1443,1444,1447],{},[16,1445,1446],{},"Haskell:"," For when you want your actuarial models to be mathematically beautiful and completely incomprehensible to your coworkers",[28,1449,1451],{"id":1450},"my-current-stack","My Current Stack",[1282,1453,1454,1459,1470,1475,1484],{},[1285,1455,1456,1458],{},[16,1457,1382],{}," Core engine (pricing, simulation, validation)",[1285,1460,1461,1463,1464,1469],{},[16,1462,1289],{}," Exploratory data analysis, ",[21,1465,1468],{"href":1466,"rel":1467},"https:\u002F\u002Fmatplotlib.org\u002F",[25],"plotting",", quick prototyping",[1285,1471,1472,1474],{},[16,1473,1306],{}," Stats-heavy coursework, historical actuarial studies",[1285,1476,1477,1426,1480,1483],{},[16,1478,1479],{},"Vue",[16,1481,1482],{},"Tailwind:"," Frontend blog and internal dashboard UI",[1285,1485,1486,1489],{},[16,1487,1488],{},"PostgreSQL:"," Database that works",[28,1491,1493],{"id":1492},"what-im-building-in-go-and-you-should-too","What I'm Building in Go (And You Should Too)",[1282,1495,1496,1503,1518,1524,1530],{},[1285,1497,1498,1502],{},[21,1499,101],{"href":1500,"rel":1501},"https:\u002F\u002Fgithub.com\u002Flubasinkal\u002Factuworry",[25],": A simulation engine for actuarial pricing\u002Freserving",[1285,1504,1505,1508,1509,1513,1514,1414],{},[16,1506,1507],{},"Life Pricing Tool:"," Command-line tool for ",[21,1510,1512],{"href":105,"rel":1511},[25],"life insurance"," pricing\u002Freserves (",[21,1515,1517],{"href":1386,"rel":1516},[25],"built with Cobra CLI",[1285,1519,1520,1523],{},[16,1521,1522],{},"Quant Backtesting System:"," Simulations and signal testing (in progress, will be open source)",[1285,1525,1526,1529],{},[16,1527,1528],{},"Whatever I Can Get Away With:"," Give me a chance and I'll write it in Go",[1285,1531,1532,1535,1536],{},[16,1533,1534],{},"Internal Actuarial API:"," RESTful service using the standard library for policy calculations - ",[21,1537,1539],{"href":1538},"\u002Fwork\u002Fresume","Here's a CV and Resume Link",[28,1541,1543],{"id":1542},"getting-started-your-first-go-actuarial-program","Getting Started: Your First Go Actuarial Program",[13,1545,1546],{},"Want to dip your toes in? Here's a simple actuarial calculation in Go:",[140,1548,1550],{"className":142,"code":1549,"language":144,"meta":145,"style":145},"package main\n\nimport (\n    \"fmt\"\n    \"math\"\n)\n\ntype Policy struct {\n    Age            int\n    CoverageAmount float64\n    Term           int\n}\n\nfunc calculatePremium(p Policy, mortalityRate float64, interestRate float64) float64 {\n    \u002F\u002F Simple net single premium calculation\n    discountFactor := math.Pow(1+interestRate, float64(-p.Term))\n    survivalProb := math.Pow(1-mortalityRate, float64(p.Term))\n\n    return p.CoverageAmount * discountFactor * survivalProb\n}\n\nfunc main() {\n    policy := Policy{\n        Age:            35,\n        CoverageAmount: 100000,\n        Term:           20,\n    }\n\n    premium := calculatePremium(policy, 0.001, 0.05)\n    fmt.Printf(\"Premium for age %d: $%.2f\\n\", policy.Age, premium)\n}\n\n\u002F\u002F Run this with: go run main.go\n\u002F\u002F No dependencies, no virtual environments, no tears\n",[147,1551,1552,1558,1562,1568,1577,1585,1589,1593,1604,1612,1620,1627,1631,1635,1661,1666,1699,1724,1728,1745,1749,1753,1761,1773,1783,1792,1803,1808,1813,1834,1865,1870,1875,1881],{"__ignoreMap":145},[150,1553,1554,1556],{"class":152,"line":153},[150,1555,856],{"class":163},[150,1557,859],{"class":167},[150,1559,1560],{"class":152,"line":160},[150,1561,240],{"emptyLinePlaceholder":239},[150,1563,1564,1566],{"class":152,"line":193},[150,1565,486],{"class":163},[150,1567,870],{"class":171},[150,1569,1570,1572,1575],{"class":152,"line":218},[150,1571,875],{"class":594},[150,1573,1574],{"class":167},"fmt",[150,1576,881],{"class":594},[150,1578,1579,1581,1583],{"class":152,"line":236},[150,1580,875],{"class":594},[150,1582,815],{"class":167},[150,1584,881],{"class":594},[150,1586,1587],{"class":152,"line":243},[150,1588,275],{"class":171},[150,1590,1591],{"class":152,"line":260},[150,1592,240],{"emptyLinePlaceholder":239},[150,1594,1595,1597,1600,1602],{"class":152,"line":278},[150,1596,903],{"class":163},[150,1598,1599],{"class":167}," Policy",[150,1601,909],{"class":163},[150,1603,190],{"class":171},[150,1605,1606,1609],{"class":152,"line":300},[150,1607,1608],{"class":171},"    Age            ",[150,1610,1611],{"class":163},"int\n",[150,1613,1614,1617],{"class":152,"line":315},[150,1615,1616],{"class":171},"    CoverageAmount ",[150,1618,1619],{"class":163},"float64\n",[150,1621,1622,1625],{"class":152,"line":330},[150,1623,1624],{"class":171},"    Term           ",[150,1626,1611],{"class":163},[150,1628,1629],{"class":152,"line":336},[150,1630,370],{"class":171},[150,1632,1633],{"class":152,"line":342},[150,1634,240],{"emptyLinePlaceholder":239},[150,1636,1637,1639,1641,1643,1645,1648,1650,1653,1655,1657,1659],{"class":152,"line":347},[150,1638,164],{"class":163},[150,1640,687],{"class":167},[150,1642,287],{"class":171},[150,1644,175],{"class":167},[150,1646,1647],{"class":171},", mortalityRate ",[150,1649,699],{"class":163},[150,1651,1652],{"class":171},", interestRate ",[150,1654,699],{"class":163},[150,1656,702],{"class":171},[150,1658,699],{"class":163},[150,1660,190],{"class":171},[150,1662,1663],{"class":152,"line":358},[150,1664,1665],{"class":156},"    \u002F\u002F Simple net single premium calculation\n",[150,1667,1668,1671,1673,1676,1679,1681,1683,1686,1689,1691,1693,1696],{"class":152,"line":367},[150,1669,1670],{"class":171},"    discountFactor ",[150,1672,199],{"class":163},[150,1674,1675],{"class":171}," math.",[150,1677,1678],{"class":167},"Pow",[150,1680,269],{"class":171},[150,1682,272],{"class":167},[150,1684,1685],{"class":163},"+",[150,1687,1688],{"class":171},"interestRate, ",[150,1690,699],{"class":163},[150,1692,269],{"class":171},[150,1694,1695],{"class":163},"-",[150,1697,1698],{"class":171},"p.Term))\n",[150,1700,1701,1704,1706,1708,1710,1712,1714,1716,1719,1721],{"class":152,"line":373},[150,1702,1703],{"class":171},"    survivalProb ",[150,1705,199],{"class":163},[150,1707,1675],{"class":171},[150,1709,1678],{"class":167},[150,1711,269],{"class":171},[150,1713,272],{"class":167},[150,1715,1695],{"class":163},[150,1717,1718],{"class":171},"mortalityRate, ",[150,1720,699],{"class":163},[150,1722,1723],{"class":171},"(p.Term))\n",[150,1725,1726],{"class":152,"line":1018},[150,1727,240],{"emptyLinePlaceholder":239},[150,1729,1730,1732,1735,1737,1740,1742],{"class":152,"line":1036},[150,1731,361],{"class":163},[150,1733,1734],{"class":171}," p.CoverageAmount ",[150,1736,716],{"class":163},[150,1738,1739],{"class":171}," discountFactor ",[150,1741,716],{"class":163},[150,1743,1744],{"class":171}," survivalProb\n",[150,1746,1747],{"class":152,"line":1041},[150,1748,370],{"class":171},[150,1750,1751],{"class":152,"line":1046},[150,1752,240],{"emptyLinePlaceholder":239},[150,1754,1755,1757,1759],{"class":152,"line":1057},[150,1756,164],{"class":163},[150,1758,1051],{"class":167},[150,1760,1054],{"class":171},[150,1762,1763,1766,1768,1770],{"class":152,"line":1074},[150,1764,1765],{"class":171},"    policy ",[150,1767,199],{"class":163},[150,1769,1599],{"class":167},[150,1771,1772],{"class":171},"{\n",[150,1774,1775,1778,1780],{"class":152,"line":1090},[150,1776,1777],{"class":171},"        Age:            ",[150,1779,1001],{"class":167},[150,1781,1782],{"class":171},",\n",[150,1784,1785,1788,1790],{"class":152,"line":1095},[150,1786,1787],{"class":171},"        CoverageAmount: ",[150,1789,1007],{"class":167},[150,1791,1782],{"class":171},[150,1793,1795,1798,1801],{"class":152,"line":1794},26,[150,1796,1797],{"class":171},"        Term:           ",[150,1799,1800],{"class":167},"20",[150,1802,1782],{"class":171},[150,1804,1806],{"class":152,"line":1805},27,[150,1807,339],{"class":171},[150,1809,1811],{"class":152,"line":1810},28,[150,1812,240],{"emptyLinePlaceholder":239},[150,1814,1816,1818,1820,1822,1825,1828,1830,1832],{"class":152,"line":1815},29,[150,1817,991],{"class":171},[150,1819,199],{"class":163},[150,1821,687],{"class":167},[150,1823,1824],{"class":171},"(policy, ",[150,1826,1827],{"class":167},"0.001",[150,1829,38],{"class":171},[150,1831,1013],{"class":167},[150,1833,275],{"class":171},[150,1835,1837,1840,1843,1845,1848,1851,1854,1857,1860,1862],{"class":152,"line":1836},30,[150,1838,1839],{"class":171},"    fmt.",[150,1841,1842],{"class":167},"Printf",[150,1844,269],{"class":171},[150,1846,1847],{"class":594},"\"Premium for age ",[150,1849,1850],{"class":171},"%d",[150,1852,1853],{"class":594},": $",[150,1855,1856],{"class":171},"%.2f",[150,1858,1859],{"class":163},"\\n",[150,1861,1273],{"class":594},[150,1863,1864],{"class":171},", policy.Age, premium)\n",[150,1866,1868],{"class":152,"line":1867},31,[150,1869,370],{"class":171},[150,1871,1873],{"class":152,"line":1872},32,[150,1874,240],{"emptyLinePlaceholder":239},[150,1876,1878],{"class":152,"line":1877},33,[150,1879,1880],{"class":156},"\u002F\u002F Run this with: go run main.go\n",[150,1882,1884],{"class":152,"line":1883},34,[150,1885,1886],{"class":156},"\u002F\u002F No dependencies, no virtual environments, no tears\n",[28,1888,1890],{"id":1889},"resources-to-get-you-started","Resources to Get You Started",[1282,1892,1893,1903,1913,1923,1932],{},[1285,1894,1895,1902],{},[16,1896,1897,1901],{},[21,1898,1900],{"href":1249,"rel":1899},[25],"A Tour of Go",":"," Interactive tutorial",[1285,1904,1905,1912],{},[16,1906,1907,1901],{},[21,1908,1911],{"href":1909,"rel":1910},"https:\u002F\u002Fgo.dev\u002Fdoc\u002Feffective_go",[25],"Effective Go"," Best practices from the source",[1285,1914,1915,1922],{},[16,1916,1917,1901],{},[21,1918,1921],{"href":1919,"rel":1920},"https:\u002F\u002Fgithub.com\u002Favelino\u002Fawesome-go",[25],"Awesome Go"," Curated list of Go packages",[1285,1924,1925,1931],{},[16,1926,1927,1901],{},[21,1928,1930],{"href":1228,"rel":1929},[25],"pkg.go.dev"," Go package documentation",[1285,1933,1934,1941],{},[16,1935,1936,1901],{},[21,1937,1940],{"href":1938,"rel":1939},"https:\u002F\u002Fgobyexample.com\u002F",[25],"Go by Example"," Practical examples",[28,1943,1945],{"id":1944},"final-thoughts","Final Thoughts",[13,1947,1948,1949,1952,1953,1956,1957,1960],{},"Go may not be as ",[16,1950,1951],{},"statistically rich"," as R or as ",[16,1954,1955],{},"instantly approachable"," as Python — and it certainly won't replace Excel's role as the world's ",[16,1958,1959],{},"unofficial actuarial dashboard"," — but when your work moves beyond ad-hoc analysis into systems, scalable pipelines, and production-grade tools, Go starts to look like the missing piece.",[13,1962,1963,1964,38,1967,1970,1971,38,1973,1371,1975,1978,1979,38,1982,42,1985,1988,1989,38,1992,42,1995,1998,1999,2002],{},"Python shines when you need ",[16,1965,1966],{},"quick prototyping",[16,1968,1969],{},"data wrangling",", or leveraging massive libraries like ",[48,1972,388],{},[48,1974,68],{},[48,1976,1977],{},"scikit-learn",". R dominates in ",[16,1980,1981],{},"statistical modelling",[16,1983,1984],{},"rapid exploratory analysis",[16,1986,1987],{},"academic-style reporting",". Excel is unbeatable for ",[16,1990,1991],{},"instant visualization",[16,1993,1994],{},"business-friendly presentation",[16,1996,1997],{},"light-weight scenario work",". But, let's be honest: if you're using Excel or CSVs as a ",[16,2000,2001],{},"database",", it's time for an intervention.",[13,2004,2005,2006,2009,2010,389,2013,2016],{},"And if you find yourself trapped in the dark abyss of ",[16,2007,2008],{},"VBA debugging",", asking, \"Is there more to life than ",[48,2011,2012],{},"Subs",[48,2014,2015],{},"Dim"," statements?\" — you're not alone. VBA is that friend you call only when all else fails.",[13,2018,2019,2020,2023,2024,2027,2028,2031],{},"But here's where Python, R, and Excel all start showing cracks: Excel ",[16,2021,2022],{},"crashes under big data",", Python ",[16,2025,2026],{},"slows down in CPU-heavy loops"," without C glue, and R can turn ",[16,2029,2030],{},"fragile in deployment",". Go swoops in with speed, memory safety, and easy concurrency, letting you run hefty actuarial simulations, stream real-time data, and build services that won't throw a tantrum under pressure.",[13,2033,2034,2037,2038,2041,2042,2045,2046,2049],{},[16,2035,2036],{},"Worst case?"," You build a CLI or backend tool running ",[16,2039,2040],{},"10x faster"," than your current Python\u002FR script. ",[16,2043,2044],{},"Best case?"," You become the ",[16,2047,2048],{},"hero"," who rescues coworkers from 2 AM Excel macro meltdowns and Monte Carlo waiting games.",[10,2051,2052],{},[13,2053,2054],{},[48,2055,2056],{},"\"Give a person a Python script, and they'll struggle with dependencies for an hour, give a person R and they'll need glasses, give a person VBA after the 4th hour they will become philosophers\" — Anonymous Actuarial Programmer",[28,2058,2060],{"id":2059},"quick-reads","Quick Reads",[1282,2062,2063,2071],{},[1285,2064,2065,2070],{},[21,2066,2069],{"href":2067,"rel":2068},"https:\u002F\u002Fblog.actuaries.org.uk\u002Fthe-rise-of-the-citizen-developer\u002F",[25],"Empowering actuaries with data science",": For actuaries venturing into the realm of programming",[1285,2072,2073,2078],{},[21,2074,2077],{"href":2075,"rel":2076},"https:\u002F\u002Fblog.actuaries.org.uk\u002F2019\u002F5-key-skills-for-graduating-actuaries\u002F",[25],"Skills for graduating actuaries",": The actuary from 50 years ago, writing out calculations by hand, would have found it difficult to imagine today's actuary having such immense data and computing power at their disposal.",[2080,2081,2082],"style",{},"html pre.shiki code .ss8vJ, html code.shiki .ss8vJ{--shiki-default:#8B8B8B94}html pre.shiki code .sq0yK, html code.shiki .sq0yK{--shiki-default:#A0A0A0}html pre.shiki code .sNEDb, html code.shiki .sNEDb{--shiki-default:#FFC799}html pre.shiki code .sU-n2, html code.shiki .sU-n2{--shiki-default:#FFF}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html pre.shiki code .sZOz5, html code.shiki .sZOz5{--shiki-default:#99FFE4}",{"title":145,"searchDepth":160,"depth":160,"links":2084},[2085,2086,2093,2094,2095,2096,2097,2098,2099,2100,2101],{"id":30,"depth":160,"text":31},{"id":111,"depth":160,"text":112,"children":2087},[2088,2089,2090,2091,2092],{"id":116,"depth":193,"text":117},{"id":400,"depth":193,"text":401},{"id":560,"depth":193,"text":561},{"id":654,"depth":193,"text":655},{"id":798,"depth":193,"text":799},{"id":1112,"depth":160,"text":1113},{"id":1279,"depth":160,"text":1280},{"id":1358,"depth":160,"text":1359},{"id":1450,"depth":160,"text":1451},{"id":1492,"depth":160,"text":1493},{"id":1542,"depth":160,"text":1543},{"id":1889,"depth":160,"text":1890},{"id":1944,"depth":160,"text":1945},{"id":2059,"depth":160,"text":2060},"2025-08-06","From spreadsheets to simulations — a personal take on modern actuarial programming that'll make you question everything you thought you knew about actuarial education","md",{},"\u002Fblog\u002Fwhygolang",{"title":5,"description":2103},"blog\u002Fwhygolang",[144,2110,2111,2112,2113],"actuarial","insurance","simulation","software","PBIBz6QrL2mtPMp2A-m_5QGQf-06TizrnOw-3_gykYg",1779304901295]