[{"data":1,"prerenderedAt":2442},["ShallowReactive",2],{"navigation":3,"page-blog":54,"blog-list":98},[4,8,12],{"title":5,"path":6,"stem":7},"Home","\u002F","1.index",{"title":9,"path":10,"external":11},"NimblePros","\u002Fnimblepros",true,{"title":13,"path":14,"stem":15,"children":16,"page":53},"Blog","\u002Fblog","blog",[17,21,25,29,33,37,41,45,49],{"title":18,"path":19,"stem":20},"2021 Year in Review","\u002Fblog\u002F2021-year-in-review","blog\u002F1.2021-year-in-review",{"title":22,"path":23,"stem":24},"Introducing Payroll Processor","\u002Fblog\u002Fintroducing-payroll-processor","blog\u002F2.introducing-payroll-processor",{"title":26,"path":27,"stem":28},"Announcing the CSharpFunctionalExtensions.FluentAssertions Library","\u002Fblog\u002Fannouncing-csharpfunctionalextensions-fluentassertions","blog\u002F3.announcing-csharpfunctionalextensions-fluentassertions",{"title":30,"path":31,"stem":32},"2022 Year in Review","\u002Fblog\u002F2022-year-in-review","blog\u002F4.2022-year-in-review",{"title":34,"path":35,"stem":36},"CodeMash 2023 Highlights","\u002Fblog\u002Fcodemash-2023-highlights","blog\u002F5.codemash-2023-highlights",{"title":38,"path":39,"stem":40},"Stir Trek 2023 Highlights","\u002Fblog\u002Fstir-trek-2023-highlights","blog\u002F6.stir-trek-2023-highlights",{"title":42,"path":43,"stem":44},"2023 Year in Review","\u002Fblog\u002F2023-year-in-review","blog\u002F7.2023-year-in-review",{"title":46,"path":47,"stem":48},"NServiceBus Zero to Hero Series","\u002Fblog\u002Fnservicebus-series","blog\u002F8.nservicebus-series",{"title":50,"path":51,"stem":52},"Building My DIY Solar Power System: A Complete Guide","\u002Fblog\u002Fdiy-solar-project","blog\u002F9.diy-solar-project",false,{"id":55,"title":13,"body":56,"date":71,"description":68,"extension":72,"head":73,"image":71,"keywords":71,"layout":71,"meta":94,"navigation":53,"path":14,"seo":95,"stem":96,"__hash__":97},"blog\u002Fblog\u002Findex.md",{"type":57,"value":58,"toc":67},"minimark",[59,64],[60,61,63],"h1",{"id":62},"blogs","Blogs",[65,66],"blog-list",{},{"title":68,"searchDepth":69,"depth":69,"links":70},"",2,[],null,"md",{"title":74,"meta":75},"Kyle McMaster's Software Development Blog - C# .NET & Architecture Insights",[76,79,82,85,88,91],{"name":77,"content":78},"description","Explore Kyle McMaster's blog featuring in-depth articles on software development, C# .NET programming, event-driven architecture, NServiceBus, and modern engineering practices.",{"name":80,"content":81},"keywords","software development blog, C# programming, .NET development, event driven architecture, NServiceBus tutorials, software engineering, distributed systems, programming articles",{"name":83,"content":84},"author","Kyle McMaster",{"property":86,"content":87},"og:type","website",{"property":89,"content":90},"og:title","Kyle McMaster's Software Development Blog",{"property":92,"content":93},"og:description","In-depth articles on software development, C# .NET programming, event-driven architecture, and modern engineering practices.",{},{"title":13,"description":68},"blog\u002Findex","YxBkwm0A-YDSoceBKueMK34vHyKkTSgDLTvrEj8ryXI",[99,1093,1215,1381,1549,1793,1996,2193,2319],{"id":100,"title":50,"body":101,"date":1087,"description":1088,"extension":72,"head":71,"image":1089,"keywords":71,"layout":71,"meta":1090,"navigation":11,"path":51,"seo":1091,"stem":52,"__hash__":1092},"blog\u002Fblog\u002F9.diy-solar-project.md",{"type":57,"value":102,"toc":1040},[103,106,110,115,118,147,151,154,186,190,195,198,218,222,225,244,248,252,255,260,292,296,299,325,329,332,358,362,366,369,389,393,397,400,426,430,433,459,463,467,470,500,504,507,533,537,540,572,576,580,583,608,612,615,640,644,647,673,677,681,684,720,724,727,759,763,766,798,802,806,809,835,839,842,868,872,875,901,905,909,912,938,942,945,970,974,977,1015,1019,1022,1025,1028,1031,1034],[60,104,50],{"id":105},"building-my-diy-solar-power-system-a-complete-guide",[107,108,109],"p",{},"After years of researching renewable energy and watching countless YouTube videos, I finally took the plunge and built my own DIY solar power system. What started as a weekend project turned into a months-long journey of learning, problem-solving, and ultimately achieving energy independence. Here's everything I learned along the way.",[111,112,114],"h2",{"id":113},"why-diy-solar","Why DIY Solar?",[107,116,117],{},"Before diving into the technical details, let me explain why I chose to build this system myself rather than hiring professionals. The DIY approach offered several advantages:",[119,120,121,129,135,141],"ul",{},[122,123,124,128],"li",{},[125,126,127],"strong",{},"Cost savings",": Professional installation typically adds 30-50% to the total system cost",[122,130,131,134],{},[125,132,133],{},"Learning opportunity",": Hands-on experience with renewable energy systems",[122,136,137,140],{},[125,138,139],{},"Customization",": Ability to design exactly what I needed for my specific use case",[122,142,143,146],{},[125,144,145],{},"Maintenance knowledge",": Understanding how everything works makes troubleshooting much easier",[111,148,150],{"id":149},"system-overview","System Overview",[107,152,153],{},"My system is designed to provide reliable power for a small off-grid cabin, with the ability to expand as needs grow. Here's what I ended up with:",[119,155,156,162,168,174,180],{},[122,157,158,161],{},[125,159,160],{},"Solar Panels",": 6x Renogy 100W monocrystalline panels (three panels in parallel in 2-set series, ~600W total)",[122,163,164,167],{},[125,165,166],{},"Batteries",": 3x 12V 100Ah Renogy lithium iron phosphate (LiFePO4) batteries (parallel configuration)",[122,169,170,173],{},[125,171,172],{},"Charge Controller",": Renogy Rover 40A MPPT charge controller with Bluetooth monitoring",[122,175,176,179],{},[125,177,178],{},"Inverter",": Renogy 3000W pure sine wave inverter",[122,181,182,185],{},[125,183,184],{},"Monitoring",": Renogy Core Bluetooth monitoring for the charge controller and batteries",[111,187,189],{"id":188},"planning-design-phase","Planning & Design Phase",[191,192,194],"h3",{"id":193},"energy-audit-and-load-calculations","Energy Audit and Load Calculations",[107,196,197],{},"The first step was understanding exactly how much power I needed. I spent a week monitoring my energy usage with a Kill-A-Watt meter, tracking everything from lights to appliances. This revealed some surprising insights:",[119,199,200,206,212],{},[122,201,202,205],{},[125,203,204],{},"Daily energy consumption",": 8-12 kWh",[122,207,208,211],{},[125,209,210],{},"Peak power demand",": 2,800W (when running multiple appliances)",[122,213,214,217],{},[125,215,216],{},"Seasonal variations",": 40% more consumption in winter due to lighting and heating",[191,219,221],{"id":220},"system-sizing-decisions","System Sizing Decisions",[107,223,224],{},"Based on my energy audit, I calculated the system requirements:",[119,226,227,233,239],{},[122,228,229,232],{},[125,230,231],{},"Battery capacity",": 12V system with 300Ah total capacity (3.84kWh)",[122,234,235,238],{},[125,236,237],{},"Solar array",": 0.6kW (6x 100W, three panels in parallel in 2-set series) sized for modest loads; winter output varies",[122,240,241,243],{},[125,242,178],{},": 3000W continuous with 6000W surge capability",[111,245,247],{"id":246},"solar-panel-installation","Solar Panel Installation",[191,249,251],{"id":250},"panel-selection-and-specifications","Panel Selection and Specifications",[107,253,254],{},"I chose Renogy 100W monocrystalline panels for their reliability, availability, and compact size. They're easy to mount and well-documented for DIY builds.",[107,256,257],{},[125,258,259],{},"Key specifications:",[119,261,262,268,274,280,286],{},[122,263,264,267],{},[125,265,266],{},"Rated power",": 100W",[122,269,270,273],{},[125,271,272],{},"Open circuit voltage",": ~22V",[122,275,276,279],{},[125,277,278],{},"Short circuit current",": ~5.8A",[122,281,282,285],{},[125,283,284],{},"Efficiency",": ~18-20%",[122,287,288,291],{},[125,289,290],{},"Temperature coefficient",": ~-0.29%\u002F°C",[191,293,295],{"id":294},"mounting-system-design","Mounting System Design",[107,297,298],{},"I designed a custom ground-mounted rack system using galvanized steel tubing. The design considerations included:",[119,300,301,307,313,319],{},[122,302,303,306],{},[125,304,305],{},"Tilt angle",": 45° for optimal winter production (my latitude is 42°N)",[122,308,309,312],{},[125,310,311],{},"Height",": 6 feet to avoid snow accumulation and allow for easy cleaning",[122,314,315,318],{},[125,316,317],{},"Wind loading",": Designed to withstand 90 mph winds",[122,320,321,324],{},[125,322,323],{},"Corrosion resistance",": Hot-dip galvanized finish for long-term durability",[191,326,328],{"id":327},"installation-challenges","Installation Challenges",[107,330,331],{},"The actual installation revealed several unexpected challenges:",[119,333,334,340,346,352],{},[122,335,336,339],{},[125,337,338],{},"Ground conditions",": Rocky soil required specialized drilling equipment",[122,341,342,345],{},[125,343,344],{},"Panel alignment",": Getting all six panels perfectly aligned took multiple attempts",[122,347,348,351],{},[125,349,350],{},"Weatherproofing",": Ensuring all connections were properly sealed against moisture",[122,353,354,357],{},[125,355,356],{},"Safety",": Working at height with heavy panels required careful planning",[111,359,361],{"id":360},"electrical-system-design","Electrical System Design",[191,363,365],{"id":364},"series-vs-parallel-configuration","Series vs. Parallel Configuration",[107,367,368],{},"I configured the array as three panels in parallel in 2-set series (3P2S) to balance voltage for MPPT efficiency with manageable current:",[119,370,371,377,383],{},[122,372,373,376],{},[125,374,375],{},"Panel configuration",": 6 panels total; three panels in parallel in 2-set series (3P2S), ~600W",[122,378,379,382],{},[125,380,381],{},"Benefits",": Good MPPT tracking voltage per string while keeping array current reasonable",[122,384,385,388],{},[125,386,387],{},"Considerations",": String mismatch can reduce output; use a combiner or inline fusing for each string",[111,390,392],{"id":391},"charge-controller-setup","Charge Controller Setup",[191,394,396],{"id":395},"mppt-vs-pwm-decision","MPPT vs. PWM Decision",[107,398,399],{},"I chose the Renogy Rover 40A MPPT charge controller for several reasons:",[119,401,402,408,414,420],{},[122,403,404,407],{},[125,405,406],{},"Higher efficiency",": 95-98% vs. 70-80% for PWM",[122,409,410,413],{},[125,411,412],{},"Flexible voltage",": Can handle higher panel voltages efficiently",[122,415,416,419],{},[125,417,418],{},"Better performance",": Especially in low-light conditions",[122,421,422,425],{},[125,423,424],{},"Monitoring capabilities",": Built-in data logging and Bluetooth connectivity",[191,427,429],{"id":428},"monitoring-and-troubleshooting","Monitoring and Troubleshooting",[107,431,432],{},"The Bluetooth monitoring app proved invaluable for:",[119,434,435,441,447,453],{},[122,436,437,440],{},[125,438,439],{},"Real-time data",": Voltage, current, power, and temperature",[122,442,443,446],{},[125,444,445],{},"Historical trends",": Daily and monthly energy production",[122,448,449,452],{},[125,450,451],{},"Fault diagnosis",": Quick identification of system issues",[122,454,455,458],{},[125,456,457],{},"Performance optimization",": Fine-tuning based on actual data",[111,460,462],{"id":461},"battery-system","Battery System",[191,464,466],{"id":465},"battery-chemistry-choice","Battery Chemistry Choice",[107,468,469],{},"I selected LiFePO4 batteries over traditional lead-acid for several advantages:",[119,471,472,478,483,488,494],{},[122,473,474,477],{},[125,475,476],{},"Longer lifespan",": 2000+ cycles vs. 300-500 for lead-acid",[122,479,480,482],{},[125,481,406],{},": 95% vs. 80-85% for lead-acid",[122,484,485,487],{},[125,486,418],{},": Consistent voltage throughout discharge cycle",[122,489,490,493],{},[125,491,492],{},"Lower maintenance",": No watering or equalization required",[122,495,496,499],{},[125,497,498],{},"Temperature tolerance",": Better performance in cold weather",[191,501,503],{"id":502},"capacity-planning","Capacity Planning",[107,505,506],{},"My 3.84kWh battery bank provides:",[119,508,509,515,521,527],{},[122,510,511,514],{},[125,512,513],{},"Daily autonomy",": 8-12 hours without solar input",[122,516,517,520],{},[125,518,519],{},"Depth of discharge",": 80% (~3.1kWh usable)",[122,522,523,526],{},[125,524,525],{},"Cycle life",": 2000+ cycles at 80% DOD",[122,528,529,532],{},[125,530,531],{},"Expansion capability",": Easy to add more batteries in parallel",[191,534,536],{"id":535},"temperature-management","Temperature Management",[107,538,539],{},"Battery performance and lifespan depend heavily on temperature:",[119,541,542,548,554,560,566],{},[122,543,544,547],{},[125,545,546],{},"Operating range",": 32°F to 113°F (0°C to 45°C)",[122,549,550,553],{},[125,551,552],{},"Optimal temperature",": 68°F to 77°F (20°C to 25°C)",[122,555,556,559],{},[125,557,558],{},"Ventilation",": Natural airflow through battery enclosure",[122,561,562,565],{},[125,563,564],{},"Insulation",": R-13 insulation in battery compartment",[122,567,568,571],{},[125,569,570],{},"Heating",": Small space heater for winter operation",[111,573,575],{"id":574},"inverter-selection-and-integration","Inverter Selection and Integration",[191,577,579],{"id":578},"pure-sine-wave-vs-modified-sine-wave","Pure Sine Wave vs. Modified Sine Wave",[107,581,582],{},"I chose a Renogy 3000W pure sine wave inverter for several reasons:",[119,584,585,591,596,602],{},[122,586,587,590],{},[125,588,589],{},"Compatibility",": Works with all electronic devices",[122,592,593,595],{},[125,594,284],{},": Better power factor and lower harmonic distortion",[122,597,598,601],{},[125,599,600],{},"Reliability",": Less stress on sensitive electronics",[122,603,604,607],{},[125,605,606],{},"Future-proofing",": Ready for any device I might want to power",[191,609,611],{"id":610},"sizing-considerations","Sizing Considerations",[107,613,614],{},"The Renogy 3000W inverter provides:",[119,616,617,623,629,634],{},[122,618,619,622],{},[125,620,621],{},"Continuous power",": 3000W (25A at 120V)",[122,624,625,628],{},[125,626,627],{},"Surge capacity",": 6000W for 30 seconds",[122,630,631,633],{},[125,632,284],{},": 90% at full load, 85% at typical loads",[122,635,636,639],{},[125,637,638],{},"Standby consumption",": 15W (important for off-grid systems)",[191,641,643],{"id":642},"integration-with-electrical-system","Integration with Electrical System",[107,645,646],{},"Connecting to existing electrical infrastructure required:",[119,648,649,655,661,667],{},[122,650,651,654],{},[125,652,653],{},"Transfer switch",": Manual switch between grid and solar power",[122,656,657,660],{},[125,658,659],{},"Sub-panel",": Dedicated circuits for solar-powered loads",[122,662,663,666],{},[125,664,665],{},"Ground fault protection",": GFCI outlets for outdoor circuits",[122,668,669,672],{},[125,670,671],{},"Load balancing",": Distributing loads across available power",[111,674,676],{"id":675},"installation-journey","Installation Journey",[191,678,680],{"id":679},"timeline-and-milestones","Timeline and Milestones",[107,682,683],{},"The project took longer than expected:",[119,685,686,692,698,704,709,714],{},[122,687,688,691],{},[125,689,690],{},"Planning and design",": 3 weeks",[122,693,694,697],{},[125,695,696],{},"Permitting and approvals",": 2 weeks",[122,699,700,703],{},[125,701,702],{},"Foundation and mounting",": 1 week",[122,705,706,697],{},[125,707,708],{},"Electrical installation",[122,710,711,703],{},[125,712,713],{},"Testing and commissioning",[122,715,716,719],{},[125,717,718],{},"Total time",": 9 weeks (vs. 4 weeks estimated)",[191,721,723],{"id":722},"essential-tools-and-equipment","Essential Tools and Equipment",[107,725,726],{},"Some tools proved absolutely essential:",[119,728,729,735,741,747,753],{},[122,730,731,734],{},[125,732,733],{},"Multimeter",": For voltage and current measurements",[122,736,737,740],{},[125,738,739],{},"Crimping tools",": Proper wire termination is critical",[122,742,743,746],{},[125,744,745],{},"Torque wrench",": Ensuring proper bolt tightness",[122,748,749,752],{},[125,750,751],{},"Weatherproofing supplies",": Silicone sealant, heat shrink, etc.",[122,754,755,758],{},[125,756,757],{},"Safety equipment",": Gloves, safety glasses, fall protection",[191,760,762],{"id":761},"safety-lessons-learned","Safety Lessons Learned",[107,764,765],{},"Safety should always be the top priority:",[119,767,768,774,780,786,792],{},[122,769,770,773],{},[125,771,772],{},"Electrical safety",": Always verify circuits are de-energized",[122,775,776,779],{},[125,777,778],{},"Fall protection",": Use proper harnesses when working at height",[122,781,782,785],{},[125,783,784],{},"Weather conditions",": Avoid working in wet or windy conditions",[122,787,788,791],{},[125,789,790],{},"Personal protective equipment",": Wear appropriate safety gear",[122,793,794,797],{},[125,795,796],{},"Emergency planning",": Have a plan for electrical emergencies",[111,799,801],{"id":800},"performance-and-results","Performance and Results",[191,803,805],{"id":804},"energy-production-data","Energy Production Data",[107,807,808],{},"After six months of operation, the system has exceeded expectations:",[119,810,811,817,823,829],{},[122,812,813,816],{},[125,814,815],{},"Average daily production",": 7.2 kWh (winter) to 12.8 kWh (summer)",[122,818,819,822],{},[125,820,821],{},"Peak efficiency",": 92% of rated capacity on optimal days",[122,824,825,828],{},[125,826,827],{},"Seasonal variation",": 40% difference between summer and winter",[122,830,831,834],{},[125,832,833],{},"Cloud impact",": 60-80% production on overcast days",[191,836,838],{"id":837},"cost-savings-and-payback","Cost Savings and Payback",[107,840,841],{},"The financial benefits are substantial:",[119,843,844,850,856,862],{},[122,845,846,849],{},[125,847,848],{},"Monthly savings",": $120-180 (depending on season)",[122,851,852,855],{},[125,853,854],{},"Annual savings",": $1,800",[122,857,858,861],{},[125,859,860],{},"Payback period",": 2.3 years",[122,863,864,867],{},[125,865,866],{},"Lifetime savings",": $45,000+ (25-year system life)",[191,869,871],{"id":870},"system-reliability","System Reliability",[107,873,874],{},"The system has proven very reliable:",[119,876,877,883,889,895],{},[122,878,879,882],{},[125,880,881],{},"Uptime",": 99.7% (only 2.6 hours downtime in 6 months)",[122,884,885,888],{},[125,886,887],{},"Maintenance",": Minimal - just monthly cleaning and quarterly inspections",[122,890,891,894],{},[125,892,893],{},"Weather resilience",": Survived multiple storms and extreme temperatures",[122,896,897,900],{},[125,898,899],{},"Performance consistency",": Very predictable daily production",[111,902,904],{"id":903},"lessons-learned-and-future-improvements","Lessons Learned and Future Improvements",[191,906,908],{"id":907},"what-id-do-differently","What I'd Do Differently",[107,910,911],{},"Looking back, several things could have been improved:",[119,913,914,920,926,932],{},[122,915,916,919],{},[125,917,918],{},"Better planning",": More detailed site analysis before starting",[122,921,922,925],{},[125,923,924],{},"Professional consultation",": Some aspects would have benefited from expert advice",[122,927,928,931],{},[125,929,930],{},"Documentation",": More detailed photos and notes during construction",[122,933,934,937],{},[125,935,936],{},"Testing",": More comprehensive testing before final installation",[191,939,941],{"id":940},"future-expansion-plans","Future Expansion Plans",[107,943,944],{},"The system is designed for easy expansion:",[119,946,947,953,958,964],{},[122,948,949,952],{},[125,950,951],{},"Additional panels",": Can add 4 more panels for 3.2kW total",[122,954,955,957],{},[125,956,231],{},": Easy to double battery bank to 5.12kWh",[122,959,960,963],{},[125,961,962],{},"Grid-tie capability",": Could add grid-tie inverter for net metering",[122,965,966,969],{},[125,967,968],{},"Monitoring upgrades",": More sophisticated data logging and remote monitoring",[191,971,973],{"id":972},"advice-for-fellow-diyers","Advice for Fellow DIYers",[107,975,976],{},"If you're considering a similar project:",[978,979,980,986,992,998,1004,1009],"ol",{},[122,981,982,985],{},[125,983,984],{},"Start small",": Begin with a basic system and expand gradually",[122,987,988,991],{},[125,989,990],{},"Research thoroughly",": Understand local codes and requirements",[122,993,994,997],{},[125,995,996],{},"Safety first",": Don't cut corners on safety measures",[122,999,1000,1003],{},[125,1001,1002],{},"Quality components",": Invest in reliable equipment from reputable suppliers",[122,1005,1006,1008],{},[125,1007,930],{},": Keep detailed records of everything you do",[122,1010,1011,1014],{},[125,1012,1013],{},"Community support",": Join online forums and local groups for advice",[111,1016,1018],{"id":1017},"conclusion","Conclusion",[107,1020,1021],{},"Building my DIY solar power system was one of the most rewarding projects I've ever undertaken. The combination of technical challenge, practical application, and environmental impact made it truly worthwhile. While it required significant time and effort, the knowledge gained and energy independence achieved make it an investment I'd recommend to anyone interested in renewable energy.",[107,1023,1024],{},"The system has not only reduced my energy bills but also provided valuable insights into sustainable living. Every sunny day now feels like a small victory, and the satisfaction of powering my home with clean, renewable energy never gets old.",[107,1026,1027],{},"If you're considering a similar project, I hope this guide provides a solid foundation for your planning. The journey from concept to completion is challenging but incredibly rewarding. Start with good planning, prioritize safety, and don't hesitate to ask for help when you need it.",[107,1029,1030],{},"The future of energy is renewable, and there's no better time than now to start building it yourself.",[1032,1033],"hr",{},[107,1035,1036],{},[1037,1038,1039],"em",{},"Have you built or are you planning a DIY solar project? I'd love to hear about your experiences and answer any questions you might have. Feel free to share your thoughts in the comments below!",{"title":68,"searchDepth":69,"depth":69,"links":1041},[1042,1043,1044,1049,1054,1057,1061,1066,1071,1076,1081,1086],{"id":113,"depth":69,"text":114},{"id":149,"depth":69,"text":150},{"id":188,"depth":69,"text":189,"children":1045},[1046,1048],{"id":193,"depth":1047,"text":194},3,{"id":220,"depth":1047,"text":221},{"id":246,"depth":69,"text":247,"children":1050},[1051,1052,1053],{"id":250,"depth":1047,"text":251},{"id":294,"depth":1047,"text":295},{"id":327,"depth":1047,"text":328},{"id":360,"depth":69,"text":361,"children":1055},[1056],{"id":364,"depth":1047,"text":365},{"id":391,"depth":69,"text":392,"children":1058},[1059,1060],{"id":395,"depth":1047,"text":396},{"id":428,"depth":1047,"text":429},{"id":461,"depth":69,"text":462,"children":1062},[1063,1064,1065],{"id":465,"depth":1047,"text":466},{"id":502,"depth":1047,"text":503},{"id":535,"depth":1047,"text":536},{"id":574,"depth":69,"text":575,"children":1067},[1068,1069,1070],{"id":578,"depth":1047,"text":579},{"id":610,"depth":1047,"text":611},{"id":642,"depth":1047,"text":643},{"id":675,"depth":69,"text":676,"children":1072},[1073,1074,1075],{"id":679,"depth":1047,"text":680},{"id":722,"depth":1047,"text":723},{"id":761,"depth":1047,"text":762},{"id":800,"depth":69,"text":801,"children":1077},[1078,1079,1080],{"id":804,"depth":1047,"text":805},{"id":837,"depth":1047,"text":838},{"id":870,"depth":1047,"text":871},{"id":903,"depth":69,"text":904,"children":1082},[1083,1084,1085],{"id":907,"depth":1047,"text":908},{"id":940,"depth":1047,"text":941},{"id":972,"depth":1047,"text":973},{"id":1017,"depth":69,"text":1018},"2024-12-01T00:00:00.000Z","From planning to installation, here's everything I learned building a complete off-grid solar power system including panels, batteries, charge controller, and inverter.","\u002Fdiy-solar-project.jpg",{},{"title":50,"description":1088},"BOJHZAMsrQJMu5QGdZL0_Lve4vSSs2phLVCVV6Nrblo",{"id":1094,"title":46,"body":1095,"date":1101,"description":1102,"extension":72,"head":1183,"image":1103,"keywords":1202,"layout":71,"meta":1212,"navigation":11,"path":47,"seo":1213,"stem":48,"__hash__":1214},"blog\u002Fblog\u002F8.nservicebus-series.md",{"type":57,"value":1096,"toc":1181},[1097,1106,1109,1114],[1098,1099],"seo-structured-data",{":keywords":1100,"datePublished":1101,"description":1102,"image":1103,"title":46,"type":1104,"url":1105},"[\"NServiceBus\",\"event driven architecture\",\"distributed systems\",\"asynchronous messaging\",\"C# development\",\".NET\",\"software architecture\",\"microservices\",\"messaging patterns\",\"NimblePros\",\"software engineering\"]","2024-02-18T00:00:00.000Z","Complete NServiceBus tutorial series for C# developers covering asynchronous messaging, distributed systems, event-driven architecture, and NServiceBus implementation from zero to hero","\u002Fnservicebus-zero-to-hero-series.png","BlogPosting","https:\u002F\u002Fwww.kylemcmaster.com\u002Fblog\u002Fnservicebus-series",[107,1107,1108],{},"Over on the NimblePros' blog, I have written a series on NServiceBus and asynchronous messaging in distributed systems. This series is designed to take you from zero to hero with NServiceBus. I hope you enjoy the content and find it helpful in your journey to learn NServiceBus.",[107,1110,1111],{},[1112,1113],"img",{"alt":46,"src":1103},[119,1115,1116,1125,1132,1139,1146,1153,1160,1167,1174],{},[122,1117,1118],{},[1119,1120,1124],"a",{"href":1121,"rel":1122},"https:\u002F\u002Fblog.nimblepros.com\u002Fblogs\u002Fwhat-is-asynchronous-messaging\u002F",[1123],"nofollow","What is Asynchronous Messaging?",[122,1126,1127],{},[1119,1128,1131],{"href":1129,"rel":1130},"https:\u002F\u002Fblog.nimblepros.com\u002Fblogs\u002Fwhat-is-nservicebus\u002F",[1123],"What is NServiceBus?",[122,1133,1134],{},[1119,1135,1138],{"href":1136,"rel":1137},"https:\u002F\u002Fblog.nimblepros.com\u002Fblogs\u002Fgetting-started-with-nservicebus\u002F",[1123],"Getting Started With NServiceBus",[122,1140,1141],{},[1119,1142,1145],{"href":1143,"rel":1144},"https:\u002F\u002Fblog.nimblepros.com\u002Fblogs\u002Fcommands-events-messages-explained",[1123],"Command, Events, Messages Explained",[122,1147,1148],{},[1119,1149,1152],{"href":1150,"rel":1151},"https:\u002F\u002Fblog.nimblepros.com\u002Fblogs\u002Fnservicebus-message-handlers\u002F",[1123],"Testing NServiceBus Message Handlers",[122,1154,1155],{},[1119,1156,1159],{"href":1157,"rel":1158},"https:\u002F\u002Fblog.nimblepros.com\u002Fblogs\u002Fsupercharged-sagas-introduction\u002F",[1123],"Supercharged Sagas - Introduction",[122,1161,1162],{},[1119,1163,1166],{"href":1164,"rel":1165},"https:\u002F\u002Fblog.nimblepros.com\u002Fblogs\u002Fsupercharged-sagas-creating-your-first-nservicebus-saga\u002F",[1123],"Supercharged Sagas - Creating Your First NServiceBus Saga",[122,1168,1169],{},[1119,1170,1173],{"href":1171,"rel":1172},"https:\u002F\u002Fblog.nimblepros.com\u002Fblogs\u002Fsupercharged-sagas-timeout-tips\u002F",[1123],"Supercharged Sagas - Timeout Tips",[122,1175,1176],{},[1119,1177,1180],{"href":1178,"rel":1179},"https:\u002F\u002Fblog.nimblepros.com\u002Fblogs\u002Fsupercharged-sagas-unit-testing-strategies\u002F",[1123],"Supercharged Sagas - Unit Testing Strategies",{"title":68,"searchDepth":69,"depth":69,"links":1182},[],{"meta":1184},[1185,1186,1189,1191,1193,1195,1198,1200],{"name":83,"content":84},{"name":1187,"content":1188},"robots","index, follow",{"property":86,"content":1190},"article",{"property":1192,"content":84},"article:author",{"property":1194,"content":1101},"article:published_time",{"property":1196,"content":1197},"article:tag","NServiceBus",{"property":1196,"content":1199},"Event Driven Architecture",{"property":1196,"content":1201},"Distributed Systems",[1197,1203,1204,1205,1206,1207,1208,1209,1210,9,1211],"event driven architecture","distributed systems","asynchronous messaging","C# development",".NET","software architecture","microservices","messaging patterns","software engineering",{},{"title":46,"description":1102},"SWSQLIAyLJ7P7mtyiQSUlbcAyI8Z7T0DQ931mTrLyHY",{"id":1216,"title":42,"body":1217,"date":1356,"description":1357,"extension":72,"head":1358,"image":1223,"keywords":1371,"layout":71,"meta":1378,"navigation":11,"path":43,"seo":1379,"stem":44,"__hash__":1380},"blog\u002Fblog\u002F7.2023-year-in-review.md",{"type":57,"value":1218,"toc":1341},[1219,1224,1239,1243,1246,1250,1253,1257,1260,1263,1267,1290,1294,1297,1300,1304,1307,1313,1316,1319,1327,1331,1334,1338],[107,1220,1221],{},[1112,1222],{"alt":42,"src":1223},"\u002F2023-year-in-review.png",[107,1225,1226,1227,1232,1233,1238],{},"This is the third entry in my year-in-review series that reflects on experiences over the previous 12 months of my career and personal life. If you haven't checked out this blog post on ideas for writing an article similar to this, I highly suggest checking out the ",[1119,1228,1231],{"href":1229,"rel":1230},"https:\u002F\u002Fardalis.com\u002Fyear-in-review-post-checklist\u002F",[1123],"Year in Review Checklist"," by Steve Smith. You can also check out my previous year's post here ",[1119,1234,1237],{"href":1235,"rel":1236},"https:\u002F\u002Fkylemcmaster.com\u002Fblog\u002F2022-year-in-review\u002F",[1123],"My 2022 Year In Review",".",[111,1240,1242],{"id":1241},"personal-milestones","Personal Milestones",[107,1244,1245],{},"This year was challenging and rewarding for me. My little one is another year older and it's been so amazing to see her grow. My wife has returned to work and we've been adjusting to the new dynamic of being a working family. I've been able to spend a lot of time with my daughter and I'm so grateful for that. I won't go into much detail on the personal side of things but I'm feeling very blessed to have a healthy and happy family. The personal side of things proves yet again to be the most rewarding and fulfilling part of my life and I'm excited to see what the future holds for us.",[191,1247,1249],{"id":1248},"exercise","Exercise",[107,1251,1252],{},"2023 was a year of growth in terms of my physical health. For at least most of the year, while the weather in Ohio was nice, I was been able to get back into running very consistently. Some of my biggest accomplishments were running my first 10k and shaving my single-mile pace down to the fastest time I've had since around the time I graduated from high school. I'm looking forward to warmer weather and being able to continue a regular exercise routine in 2024.",[111,1254,1256],{"id":1255},"books-i-read","Books I Read 📕",[107,1258,1259],{},"This year's technical reading list was much smaller than years past (again) but the two technical books I did manage to read were very impactful. Both authors are experts in their domains and I always learn something from the content they create. I recommend both to anyone looking to expand their knowledge on modern software development practices as they each have a unique perspective that can trigger some new ideas and insights.",[107,1261,1262],{},"Outside of the technical reading list, I also read the first book in the Dune series by Frank Herbert and I'm excited to continue that journey in 2024. It's a classic in the science fiction genre and I'm excited to see where the story goes beyond the first book.",[191,1264,1266],{"id":1265},"full-reading-list","Full reading list",[119,1268,1269,1276,1283],{},[122,1270,1271],{},[1119,1272,1275],{"href":1273,"rel":1274},"https:\u002F\u002Fwww.amazon.com\u002FCode-That-Fits-Your-Head\u002Fdp\u002F0137464401",[1123],"Code That Fits In Your Head By Mark Seeman",[122,1277,1278],{},[1119,1279,1282],{"href":1280,"rel":1281},"https:\u002F\u002Fwww.manning.com\u002Fbooks\u002Ff-sharp-in-action",[1123],"F# in Action (MEAP) By Isaac Abraham",[122,1284,1285],{},[1119,1286,1289],{"href":1287,"rel":1288},"https:\u002F\u002Fwww.amazon.com\u002FDune-Chronicles-Book-1",[1123],"Dune By Frank Herbert",[111,1291,1293],{"id":1292},"professional-and-technical-accomplishments","Professional and Technical Accomplishments",[191,1295,9],{"id":1296},"nimblepros",[107,1298,1299],{},"2023 marks the end of my second year at NimblePros and it's continued to be an amazing experience. The team has grown and that's allowed for more collaboration and learning opportunities. I've been able to work on a variety of projects and have been able to contribute to the growth of the company in a variety of ways. We've had an increase in our team's internal training and it's been awesome to participate and grow my skills as a presenter as well as learn technical concepts from others. I'm excited to see what the future holds for NimblePros and I'm looking forward to continuing to grow with the company. There are new challenges and goals I've set for myself and it's great to have a team backing me on those goals.",[191,1301,1303],{"id":1302},"github-contributions","GitHub Contributions",[107,1305,1306],{},"2023 was my second year in a row of growing my contributions and the biggest year ever in terms of contributions on GitHub as most of my client work has been on private GitHub repositories. Another factor are my contributions to open-source projects including the NimblePros, devBetter, and Ardalis repositories. Having the flexibility and influence to identify bugs or enhancements to Steve's open-source packages and contribute to them as part of my daily work is so rewarding. I've also had significant contributions to repos focused on training exercises for lunch-n-learns and training exercises. I'm looking forward to continuing this trend in 2024 and I'm excited to see where my contributions take me.",[107,1308,1309],{},[1112,1310],{"alt":1311,"src":1312},"My GitHub contributions","\u002F2023-github-contributions.png",[191,1314,1315],{"id":62},"Blogs 📝",[107,1317,1318],{},"In 2023, I wrote a total of 4 blog posts which is significantly less than in 2022. While I'm not proud of that decrease, I also know it was because of the time I spent with my family and the time I spent on other projects. I'm looking forward to getting back into the swing of things in 2024 and I'm excited to share some awesome content I'm already working on with you all. This will include blogs, videos, and other content that I'm pushing myself to expand into. 2024 should have a lot of new adventures for me and content is one area I'm planning on branching out compared to years past.",[107,1320,1321,1322,1238],{},"You can check out more of my blog posts on all things .NET, design patterns, and any programming practices I use day to day over at the ",[1119,1323,1326],{"href":1324,"rel":1325},"https:\u002F\u002Fblog.nimblepros.com\u002F",[1123],"NimblePros blog",[191,1328,1330],{"id":1329},"overall-technical-growth","Overall Technical Growth",[107,1332,1333],{},"2023 was one of the biggest years for me in terms of personal and technical growth. I learned a mastery of quite a few new tools that I hadn't used previously and I've been able to apply them to my work in a variety of ways. I've also been able to pick up some new skills in a variety of areas and I still have a lot to learn which keeps me excited about the future. 2023 laid the foundation for me to really flourish over the next few years and I am looking forward to capitalizing on the momentum I've built.",[111,1335,1337],{"id":1336},"looking-forward-to-2024","Looking forward to 2024",[107,1339,1340],{},"This past year definitely set me up for success in 2024. As I look ahead, I've learned to plan my goals within reason given my family life while also pushing the boundaries to keep myself challenged. I plan on trying to write more blog posts, create my first set of videos, and contribute to more open-source projects. I'm also trying my hand at giving talks at conferences and going to increase the frequency of speaking at meetups. In summary, I'm looking forward to a year of growth and I'm excited to see where the journey takes me.",{"title":68,"searchDepth":69,"depth":69,"links":1342},[1343,1346,1349,1355],{"id":1241,"depth":69,"text":1242,"children":1344},[1345],{"id":1248,"depth":1047,"text":1249},{"id":1255,"depth":69,"text":1256,"children":1347},[1348],{"id":1265,"depth":1047,"text":1266},{"id":1292,"depth":69,"text":1293,"children":1350},[1351,1352,1353,1354],{"id":1296,"depth":1047,"text":9},{"id":1302,"depth":1047,"text":1303},{"id":62,"depth":1047,"text":1315},{"id":1329,"depth":1047,"text":1330},{"id":1336,"depth":69,"text":1337},"2024-02-01T00:00:00.000Z","Comprehensive 2023 reflection on software development career, technology learning, consulting experiences, and professional growth in C# .NET and distributed systems",{"meta":1359},[1360,1361,1362,1363,1364,1365,1367,1369],{"name":83,"content":84},{"name":1187,"content":1188},{"property":86,"content":1190},{"property":1192,"content":84},{"property":1194,"content":1356},{"property":1196,"content":1366},"Career",{"property":1196,"content":1368},"Software Development",{"property":1196,"content":1370},"Professional Growth",[1372,1373,1374,1375,1206,1207,1376,9,1204,1211,1377],"year in review","software development career","technology learning","professional growth","software consulting","career reflection",{},{"title":42,"description":1357},"4JqyfUwFY1ymXWhO4I1U2FOXvY1oIOAQCUdaVh3-LZA",{"id":1382,"title":38,"body":1383,"date":1544,"description":1545,"extension":72,"head":71,"image":1389,"keywords":71,"layout":71,"meta":1546,"navigation":11,"path":39,"seo":1547,"stem":40,"__hash__":1548},"blog\u002Fblog\u002F6.stir-trek-2023-highlights.md",{"type":57,"value":1384,"toc":1538},[1385,1390,1393,1400,1404,1407,1416,1433,1447,1467,1476,1485,1489,1504,1511,1515,1518,1522],[107,1386,1387],{},[1112,1388],{"alt":38,"src":1389},"\u002Fstir-trek-2023-highlights.png",[107,1391,1392],{},"A few weeks ago I attended Stir Trek at AMC Theatres in Columbus, Ohio for the first time. Stir Trek is a developer conference featuring 48 sessions that fill a day full of presentations covering a wide range of topics including AI, DevOps, Architecture, and a lot more. Stir Trek's unique offering is that at the end of the sessions, attendees can simmer on what they've learned over a blockbuster movie premiere. This year's movie was Guardians of the Galaxy Volume 3! Attendees also receive a fun swag box and can enter to win \"something\" by donating to the mega food drive. Since the event was only about 2 hours from where I live, I opted to drive to the event the morning of so I awoke nice and early that Friday morning with plenty of coffee to keep me going all day and headed out. Overall, my experience was really positive and I wanted to share some of the highlights of my first time attending.",[107,1394,1395,1399],{},[1112,1396],{"alt":1397,"src":1398},"Guardians of the Galaxy Themed Swag Box","\u002Fstir-trek-swag-2023.jpg","\nGuardians of the Galaxy Themed Swag Box",[111,1401,1403],{"id":1402},"sessions-i-attended","Sessions I attended",[107,1405,1406],{},"I aimed to attend sessions covering a variety of topics that I was interested in and the speakers definitely delivered some amazing content over the course of the day.",[107,1408,1409,1410,1415],{},"To start the day I attended ",[1119,1411,1414],{"href":1412,"rel":1413},"https:\u002F\u002Fyoutu.be\u002FAYOEEPB4pE0",[1123],"The Power of Storytelling: Human Stories in a Digital World_ by Bekah Hawrot Weigel"," as I've been looking for ways to improve the content of my technical writing and blogs. This talk absolutely exceeded my expectations and was easily my favorite of the day. Bekah presented some honest and personal stories of overcoming trauma that I was able to empathize and connect with from my own personal experiences over the past year. The content of this talk really hit home with how personal software development can be and how emotionally complex people are behind all of the code and software that we as developers write and interact with. Overall, this session set the bar high and jumpstarted my day!",[107,1417,1418,1419,1424,1425,1428,1429,1432],{},"Next, I attended ",[1119,1420,1423],{"href":1421,"rel":1422},"https:\u002F\u002Fyoutu.be\u002FNWJ5XWm8emc",[1123],"Mark Noonan's talk called Maintaining Accessibility in Complicated Components"," which featured a well-thought-out demonstration of modern web techniques for improving accessibility of web applications. Two things really caught my attention during this talk with the examples being implemented in Vue ",[1037,1426,1427],{},"AND"," vanilla HTML\u002FCSS\u002FJS as well as the focus on testability which I found very insightful for Vue components. I met Mark at ",[1119,1430,1431],{"href":35},"CodeMash earlier this year"," and he immediately came off as a nice individual and very knowledgeable in this area. I enjoyed getting to discuss Vue and accessibility with him personally and will keep an eye out for his talks in the future.",[107,1434,1435,1440,1441,1446],{},[1119,1436,1439],{"href":1437,"rel":1438},"https:\u002F\u002Fyoutu.be\u002FU1uqMYmNdyI",[1123],"Jonathan \"J.\" Tower presented Migrate Your Legacy ASP.NET Projects to ASP.NET Core Incrementally with YARP"," which I had seen a previous iteration of at .NET Conf 2022 but was excited to see the talk updated for .NET 7 and hear about the improvements for YARP. I've been wanting to try the ",[1119,1442,1445],{"href":1443,"rel":1444},"https:\u002F\u002Fdeviq.com\u002Fdesign-patterns\u002Fstrangler-fig-pattern",[1123],"Strangler Fig pattern"," on a few projects I've worked on that need updated to the latest .NET versions but are too big or complex to migrate in a big bang approach. Jonathan is a Microsoft MVP so naturally, the content of this talk was well presented and carefully thought out in a way that was consumable in roughly an hour's worth of time.",[107,1448,1449,1450,1455,1456,1460,1461,1466],{},"After a quick lunch and another coffee, I was ready to catch ",[1119,1451,1454],{"href":1452,"rel":1453},"https:\u002F\u002Fyoutu.be\u002Fg6cjCbxq54Y",[1123],"Steve \"Ardalis\" Smith's talk on Improving Data Access with Abstractions",". Steve is an experienced presenter and his talks always have awesome content filled with a few funny pictures and an insightful narrative. Although I had followed Steve's PluralSight courses, conference talks, and blog for much of my .NET career, it's been really rewarding to get to work with him at ",[1119,1457,9],{"href":1458,"rel":1459},"https:\u002F\u002Fnimblepros.com",[1123]," and see how he applies patterns and concepts in real-world applications. With that being said, I was looking forward to this talk because it was a new topic that I hadn't seen him present on and knowing he publishes ",[1119,1462,1465],{"href":1463,"rel":1464},"https:\u002F\u002Fgithub.com\u002Fardalis\u002FSpecification",[1123],"Ardalis.Specification"," as a library for abstracting data access I had a rough idea of where it might lead. It ended up being a nice journey through various data access techniques like low-level ADO.NET to one of my favorite frameworks, Entity Framework Core. I enjoyed the comparison of pros and cons between ORMs like Dapper and Entity Framework. TLDR, like all other decisions in software development there are tradeoffs, both good and bad. I thought the star-based review chart was a great way to guide the listener through the pros and cons of each approach. I definitely recommend this talk to developers looking to clean up their data access in .NET.",[107,1468,1469,1470,1475],{},"Burnout is something most if not all of us developers experience at some point or another and in different ways so I was very interested in seeing ",[1119,1471,1474],{"href":1472,"rel":1473},"https:\u002F\u002Fyoutu.be\u002F9Vgd40ZLHC0",[1123],"Samuel Shaw's talk Debugging Burnout",". There were a lot of important takeaways about being proactive in identifying burnout and managing factors that can lead to feeling burnout long before reaching that stage. This talk was presented in a way I definitely could find myself watching it every so often and focusing on trying to make a habit of some of the techniques mentioned on addressing burnout.",[107,1477,1478,1479,1484],{},"To wrap up my day, the last session I attended was ",[1119,1480,1483],{"href":1481,"rel":1482},"https:\u002F\u002Fyoutu.be\u002F_faHxmWGDLU",[1123],"Not Your Mother's or Father's C# by Brendan Enrick",". I had been introduced to Brendan through the NimblePros' ecosystem but haven't had the chance to see him speak before so this was an easy choice for me. The format of the talk leads the listener through a brief history of C#'s journey to where it is today. It highlighted a lot of the features from previous versions that make the syntactic sugar additions in recent versions possible. As someone who uses C# daily, it was refreshing to see different ways of writing code and opened my eyes to a few keywords and features I haven't been using. Brendan also has a great sense of humor and made this talk a fun way to end the day!",[111,1486,1488],{"id":1487},"other-highlights","Other Highlights",[107,1490,1491,1492,1497,1498,1503],{},"Stir Trek was a lot of fun for many reasons but one thing that was really great about attending was getting to connect with a lot of folks from the Ohio developer community. The event was a chance for me to finally meet up with people I had met virtually through meetups like ",[1119,1493,1496],{"href":1494,"rel":1495},"https:\u002F\u002Fwww.meetup.com\u002Fhudson-codecraft\u002F",[1123],"Hudson CodeCraft"," and ",[1119,1499,1502],{"href":1500,"rel":1501},"https:\u002F\u002Fwww.meetup.com\u002Fcleveland-c-vb-net-user-group\u002F",[1123],"Cleveland C# User Group"," in person. Another benefit of attending was getting the chance to see a few of my fellow NimblePros who I interact with quite often remotely through apps like Zoom, Slack, and Discord but don't get much in-person time with. One of the NimblePros, Sadukie, is also an organizer of the event (you might have barely caught sight of her zipping around like The Flash 🤣). I had heard about how much planning and preparation had been done so it was rewarding to go and support the organizer's efforts. I also got to catch up with some old coworkers and meet some new people as well. Events like Stir Trek are super valuable to me now as a way to socialize with peers in a way I didn't truly appreciate in a pre-Covid world or completely remote role.",[107,1505,1506,1510],{},[1112,1507],{"alt":1508,"src":1509},"NimblePros Steve \"Ardalis\" Smith, Jeremiah \"Coop\" Cooper, Kyle McMaster (me), and Sarah \"Sadukie\" Dutkiewicz","\u002Fnimblepros-stir-trek-2023.jpg","\nNimblePros Steve \"Ardalis\" Smith, Jeremiah \"Coop\" Cooper, Kyle McMaster (me), and Sarah \"Sadukie\" Dutkiewicz 🎉",[111,1512,1514],{"id":1513},"recap","Recap",[107,1516,1517],{},"Stir Trek 2023 was absolutely awesome! The organizers and volunteers deserve a lot of credit for working hard and making the experience amazing for the attendees. I had no previous expectations and this year's conference blew me away. For being a single-day event and a little smaller than a lot of the bigger tech conferences, I left with some great memories and plenty of new ideas and concepts to reflect on. I definitely recommend attending next year if this event has been on your radar. See you there!",[111,1519,1521],{"id":1520},"resources","Resources",[119,1523,1524,1531],{},[122,1525,1526],{},[1119,1527,1530],{"href":1528,"rel":1529},"https:\u002F\u002Fstirtrek.com",[1123],"Stir Trek Website",[122,1532,1533],{},[1119,1534,1537],{"href":1535,"rel":1536},"https:\u002F\u002Fwww.youtube.com\u002Fplaylist?list=PLaHMqLt8nxCyEzND3waqwgrnOpNjPtUs_",[1123],"Stir Trek 2023 - All Sessions Youtube Playlist",{"title":68,"searchDepth":69,"depth":69,"links":1539},[1540,1541,1542,1543],{"id":1402,"depth":69,"text":1403},{"id":1487,"depth":69,"text":1488},{"id":1513,"depth":69,"text":1514},{"id":1520,"depth":69,"text":1521},"2023-06-15T00:00:00.000Z","Highlights from my experience at Stir Trek 2023",{},{"title":38,"description":1545},"SSEHLxcNupXK_VAxRnJ8Nrxe1qK2k0xJNbtMtxJNcv8",{"id":1550,"title":34,"body":1551,"date":1768,"description":1769,"extension":72,"head":1770,"image":1557,"keywords":1782,"layout":71,"meta":1790,"navigation":11,"path":35,"seo":1791,"stem":36,"__hash__":1792},"blog\u002Fblog\u002F5.codemash-2023-highlights.md",{"type":57,"value":1552,"toc":1754},[1553,1558,1567,1571,1585,1592,1613,1617,1620,1624,1627,1631,1634,1638,1641,1645,1648,1652,1655,1659,1666,1673,1680,1687,1694,1701,1705,1712,1719,1726,1733,1740,1747,1751],[107,1554,1555],{},[1112,1556],{"alt":34,"src":1557},"\u002Fcodemash-2023-highlights.png",[107,1559,1560,1561,1566],{},"I recently attended ",[1119,1562,1565],{"href":1563,"rel":1564},"https:\u002F\u002Fwww.codemash.org",[1123],"CodeMash 2023"," at Kalahari Resort in Sandusky, Ohio. This was my first time attending CodeMash and I was very impressed with the community, quality of talks, and overall experience the conference offered. This year's event had a vaporwave\u002F80s theme which made for cool lighting and what felt like a huge main stage that had the vibe of a much larger conference. The theatrics were very impressive and super fun. There were lots of activities each night that was fun to participate in like live acoustic and electric music, lightning talks, and even Carnival Games and a Casino. Since it was such a great experience, I wanted to share some of my highlights in hopes it encourages others to attend in the future.",[111,1568,1570],{"id":1569},"personal-highlights","Personal Highlights",[107,1572,1573,1574,1578,1579,1584],{},"This was the first conference I've attended since the pandemic started so I was pretty excited to get back out there, meet some new people, and socialize in the developer community. Upon arriving Wednesday night, I was very impressed with the organizers as check-in was super easy and the conference center at Kalahari resort had lots of space to socialize. For a regional conference, you can tell the CodeMash organizers have a ton of experience in bringing people together and were able to do a lot with the smaller budget they had this year. A big highlight for that night was playing board games (it's a ",[1119,1575,9],{"href":1576,"rel":1577},"https:\u002F\u002Fnimblepros.com\u002F",[1123]," thing 🎲) with ",[1119,1580,1583],{"href":1581,"rel":1582},"https:\u002F\u002Ftwitter.com\u002Fardalis",[1123],"Steve \"Ardalis\" Smith"," and some of the other attendees. I'm fairly new to the board game community so it was great to get some tips and tricks from Steve and the others although admittedly I don't think I was very good at the game! 😅",[107,1586,1587,1591],{},[1112,1588],{"alt":1589,"src":1590},"NimblePros Kyle McMaster (me), Jeremiah \"Coop\" Cooper, Steve \"Ardalis\" Smith","\u002Fnimblepros-codemash-2023.jpg","\nNimblePros Kyle McMaster (me), Jeremiah \"Coop\" Cooper, Steve \"Ardalis\" Smith 🎉",[107,1593,1594,1595,1600,1601,1606,1607,1612],{},"The other two days of the conference were packed with presentations that I'll cover in the next section but overall I think the biggest highlight of the conference was being able to socialize and meet so many people in the developer community. This conference made me appreciate the value of in-person events and networking opportunities. I enjoyed getting to experience a lot of the speakers whose talks I may have seen online as the talks felt more candid and personal attending them in person. It was great to see Steve Smith present in person for the first time as his presentation skills are absolutely amazing and you can tell he has experience in front of bigger crowds. I also enjoyed meeting some of the speakers and seeing people I've met remotely and getting to know them a little better. I went out of my way to make an effort to try to catch a few of the speakers and ask questions or give praise on their talks. It's always humbling how approachable and friendly most of the icons in the .NET space are. Shoutout to ",[1119,1596,1599],{"href":1597,"rel":1598},"https:\u002F\u002Ftwitter.com\u002Fjbogard",[1123],"Jimmy Bogard",", ",[1119,1602,1605],{"href":1603,"rel":1604},"https:\u002F\u002Ftwitter.com\u002Fcodeopinion",[1123],"Derek Comartin",", and ",[1119,1608,1611],{"href":1609,"rel":1610},"https:\u002F\u002Ftwitter.com\u002Fpcameronpresley",[1123],"Cameron Presley"," for their time engaging in discussions with me. It was great to add that human element to a lot of the names and faces I've seen online over the years and I'm looking forward to seeing them again at future conferences.",[111,1614,1616],{"id":1615},"top-talks-i-enjoyed","Top talks I enjoyed",[107,1618,1619],{},"These are the talks I enjoyed the most but by no means take away from the quality and value of the other talks I attended. I've included links to the talks on the CodeMash website in my full schedule below and I highly recommend catching the speakers at a conference if you have the chance.",[191,1621,1623],{"id":1622},"aerospace-engineering-for-computer-scientists-by-ilyana-smith","Aerospace Engineering for Computer Scientists by Ilyana Smith",[107,1625,1626],{},"Personally, this was my favorite talk of the conference as I am a huge space and physics nerd. 🚀🤓 Ilyana is a former NimblePro and it was great to see her talk about her experiences working in the aerospace industry at NASA. It was very interesting to see some of the parallels in software and aerospace engineering as well as some of the unique constraints of software in space. I'd love to see more talks like this in the future as I think it's a great way to show how software engineering can be applied to a wide variety of industries.",[191,1628,1630],{"id":1629},"neurodiversity-productivity-and-communication-a-survival-guide-by-cassandra-faris","Neurodiversity, Productivity, and Communication – A Survival Guide by Cassandra Faris",[107,1632,1633],{},"Communication is such an important skill in the workplace and something that I've been trying to improve on over the past few years. This talk was a great reminder of the importance of understanding who your audience is and tailoring your communication style to them whenever possible. The speaker presented some great tips presented in this talk on how to maximize productivity by understanding one's own abilities and how to overcome any challenges there. There were a lot of aspects of this session that I could empathize with and the personal stories shared by the author in this talk helped drive home the importance of effective communication and empathy in the workplace.",[191,1635,1637],{"id":1636},"level-up-on-functional-programming-by-rebuilding-linq-by-cameron-presley","Level Up on Functional Programming By Rebuilding LINQ By Cameron Presley",[107,1639,1640],{},"This talk was a great introduction to functional programming practices and the inner working of LINQ. LINQ is one of my favorite language features in C# so I was very curious about this talk and it did not disappoint. It started with a brief history of C# and some of the language features that allow for LINQ to exist. I recommend this talk to any C# developer who is curious about learning more about functional programming as well as any developer who is looking to level up their knowledge about the C# language and the implementation of LINQ.",[191,1642,1644],{"id":1643},"observability-made-easy-with-net-7-and-opentelemetry-by-jimmy-bogard","Observability Made Easy with .NET 7 and OpenTelemetry by Jimmy Bogard",[107,1646,1647],{},"I've seen this talk on YouTube a few times and it was great to experience it in person. Jimmy is a great speaker and this talk demonstrated the value of establishing observability in your applications, especially if they are distributed. OpenTelemetry is something I've been trying to utilize more as a .NET developer and it was great to see how easily it can be integrated with services like Application Insights, DataDog, etc. I'm looking forward to seeing how these features evolve in future versions of .NET.",[111,1649,1651],{"id":1650},"full-schedule-of-talks-i-attended","Full Schedule of Talks I Attended",[107,1653,1654],{},"There are quite a large number of talks for each time slot, so I had to be selective in what I attended but one of the upsides of this is that each time slot seemed to offer a little something for everyone. I mostly focused on talks that were related to .NET, architecture, and soft skills\u002Fproductivity with a few exceptions.",[191,1656,1658],{"id":1657},"thursday","Thursday",[107,1660,1661],{},[1119,1662,1665],{"href":1663,"rel":1664},"https:\u002F\u002Fwww.codemash.org\u002Fsession-details\u002F?id=380176",[1123],"Observability Made Easy with .NET 7 and OpenTelemetry",[107,1667,1668],{},[1119,1669,1672],{"href":1670,"rel":1671},"https:\u002F\u002Fwww.codemash.org\u002Fsession-details\u002F?id=380452",[1123],"Neurodiversity, Productivity, and Communication – A Survival Guide",[107,1674,1675],{},[1119,1676,1679],{"href":1677,"rel":1678},"https:\u002F\u002Fwww.codemash.org\u002Fsession-details\u002F?id=379779",[1123],"Finding Patterns in the Clouds",[107,1681,1682],{},[1119,1683,1686],{"href":1684,"rel":1685},"https:\u002F\u002Fwww.codemash.org\u002Fsession-details\u002F?id=380786",[1123],"Principles of Code - Five Key Points to Better Systems",[107,1688,1689],{},[1119,1690,1693],{"href":1691,"rel":1692},"https:\u002F\u002Fwww.codemash.org\u002Fsession-details?id=379721",[1123],"Don't put your messages in a bottle; Implement messaging patterns",[107,1695,1696],{},[1119,1697,1700],{"href":1698,"rel":1699},"https:\u002F\u002Fwww.codemash.org\u002Fsession-details?id=380044",[1123],"Code Review is an Architectural Necessity",[191,1702,1704],{"id":1703},"friday","Friday",[107,1706,1707],{},[1119,1708,1711],{"href":1709,"rel":1710},"https:\u002F\u002Fwww.codemash.org\u002Fsession-details?id=378108",[1123],"Aerospace Engineering for Computer Scientists",[107,1713,1714],{},[1119,1715,1718],{"href":1716,"rel":1717},"https:\u002F\u002Fwww.codemash.org\u002Fsession-details?id=374844",[1123],"Vertical Slice Architecture, not Layers!",[107,1720,1721],{},[1119,1722,1725],{"href":1723,"rel":1724},"https:\u002F\u002Fwww.codemash.org\u002Fsession-details?id=375505",[1123],"The Price of Open-Source",[107,1727,1728],{},[1119,1729,1732],{"href":1730,"rel":1731},"https:\u002F\u002Fwww.codemash.org\u002Fsession-details?id=378202",[1123],"Why We're Always Late",[107,1734,1735],{},[1119,1736,1739],{"href":1737,"rel":1738},"https:\u002F\u002Fwww.codemash.org\u002Fsession-details?id=379783",[1123],"Improving the Design of Existing Software",[107,1741,1742],{},[1119,1743,1746],{"href":1744,"rel":1745},"https:\u002F\u002Fwww.codemash.org\u002Fsession-details?id=377934",[1123],"Level Up on Functional Programming By Rebuilding LINQ",[111,1748,1750],{"id":1749},"final-thoughts","Final Thoughts",[107,1752,1753],{},"Overall, CodeMash 2023 was a great conference and it really surprised me that such a high-quality conference can happen in Northern Ohio in the middle of January. 🥶 The organizers did an absolutely amazing job with the limited budget and resources they had this year. As a first-time attendee, my expectations were exceeded and wouldn't have even guessed there were any constraints had the organizers not been so transparent about how they planned the conference and how the budget works. This transparency was refreshing to see and I applaud the organizers for their honesty. One thing I wanted to mention is how family-friendly the conference is and although my little one is currently too young for the KidzMash, I plan on bringing the family to future CodeMash events when she is old enough to participate and enjoy Kalahari. In the end, I had a great time attending the conference with some of my fellow NimblePros and I'm looking forward to attending again in the future. I hope to see you there!",{"title":68,"searchDepth":69,"depth":69,"links":1755},[1756,1757,1763,1767],{"id":1569,"depth":69,"text":1570},{"id":1615,"depth":69,"text":1616,"children":1758},[1759,1760,1761,1762],{"id":1622,"depth":1047,"text":1623},{"id":1629,"depth":1047,"text":1630},{"id":1636,"depth":1047,"text":1637},{"id":1643,"depth":1047,"text":1644},{"id":1650,"depth":69,"text":1651,"children":1764},[1765,1766],{"id":1657,"depth":1047,"text":1658},{"id":1703,"depth":1047,"text":1704},{"id":1749,"depth":69,"text":1750},"2023-01-26T00:00:00.000Z","Conference highlights and insights from CodeMash 2023 - software development conference experiences, networking, and key takeaways for developers",{"meta":1771},[1772,1773,1774,1775,1776,1777,1778,1780],{"name":83,"content":84},{"name":1187,"content":1188},{"property":86,"content":1190},{"property":1192,"content":84},{"property":1194,"content":1768},{"property":1196,"content":1368},{"property":1196,"content":1779},"Conference",{"property":1196,"content":1781},"Networking",[1783,1784,1785,1786,1211,9,1376,1787,1788,1789],"CodeMash conference","software development conference","developer networking","programming conference","developer community","technology conference","software development insights",{},{"title":34,"description":1769},"YX2etFszucqKVa7fCDTArsrFK3-qP1m6I0JciLgaQkU",{"id":1794,"title":30,"body":1795,"date":1991,"description":1992,"extension":72,"head":71,"image":1801,"keywords":71,"layout":71,"meta":1993,"navigation":11,"path":31,"seo":1994,"stem":32,"__hash__":1995},"blog\u002Fblog\u002F4.2022-year-in-review.md",{"type":57,"value":1796,"toc":1976},[1797,1802,1813,1815,1818,1821,1823,1830,1832,1876,1878,1880,1887,1889,1892,1897,1901,1927,1931,1952,1954,1957,1962,1966,1969,1973],[107,1798,1799],{},[1112,1800],{"alt":30,"src":1801},"\u002F2022-year-in-review.png",[107,1803,1804,1805,1232,1808,1238],{},"For the second year now, I've decided to do a year in review post highlighting and reflecting on my last 12 months of career and personal life. If you haven't checked out this blog post on ideas for writing an article similar to this, I highly suggest checking out ",[1119,1806,1231],{"href":1229,"rel":1807},[1123],[1119,1809,1812],{"href":1810,"rel":1811},"https:\u002F\u002Fkylemcmaster.com\u002Fblog\u002F2021-year-in-review\u002F",[1123],"My 2021 Year In Review",[111,1814,1242],{"id":1241},[107,1816,1817],{},"The beginning of 2022 was a busy time for my wife and me as we were remodeling our new home. We might have bitten off a little more than we could chew as new homeowners when we decided to completely renovate our entire first floor and much of the second floor with a new kitchen, flooring, paint, removing wallpaper, updated nursery, and a ton of other improvements as well. In the end, we came down to finishing the major pieces of the project just days before the biggest milestone of the year, the birth of our first child. 🐣🎉",[107,1819,1820],{},"In June, we welcomed our first child into the world and set forth on one of the most rewarding experiences of my life. Parenting is no small feat and I really have to give a shout-out to all the parents out there who are currently experiencing or have made it through the ups and downs of raising a little one, those first few months are rough but so incredibly precious. My wife and I feel incredibly blessed to have a beautiful healthy child to raise and the whole experience has really given me a renewed sense of purpose and drive for life. Watching my little one grow and learn is an absolutely humbling and inspiring process. Even with severe sleep deprivation, it's all been worth it. 😴😊",[111,1822,1256],{"id":1255},[107,1824,1825,1826,1829],{},"This year's technical reading list was a little smaller than I anticipated but having a child will do that to your free time! I also spent more this year reading about soft skills and productivity as they were a bit easier in terms of cognitive load when reading on minimal sleep. Finally, I also read a few books on parenting and child development which I found to be very helpful and insightful. ",[1037,1827,1828],{},"The Happiest Baby on the Block"," was a lifesaver for me as I had no previous newborn experience and I highly recommend it to any expecting parents out there.",[191,1831,1266],{"id":1265},[119,1833,1834,1841,1848,1855,1862,1869],{},[122,1835,1836],{},[1119,1837,1840],{"href":1838,"rel":1839},"https:\u002F\u002Fpragprog.com\u002Ftitles\u002Fswdddf\u002Fdomain-modeling-made-functional\u002F",[1123],"Domain Modeling Made Functional by Scott Wlaschin",[122,1842,1843],{},[1119,1844,1847],{"href":1845,"rel":1846},"https:\u002F\u002Fwww.manning.com\u002Fbooks\u002Fget-programming-with-f-sharp",[1123],"Get Programming with F#: A Guide for .NET Developers, by Isaac Abraham",[122,1849,1850],{},[1119,1851,1854],{"href":1852,"rel":1853},"https:\u002F\u002Famzn.to\u002F2XFjzFe",[1123],"Atomic Habits, by James Clear",[122,1856,1857],{},[1119,1858,1861],{"href":1859,"rel":1860},"https:\u002F\u002Famzn.to\u002F3wZ7869",[1123],"Essentialism: The Disciplined Pursuit of Less by Greg McKeown",[122,1863,1864],{},[1119,1865,1868],{"href":1866,"rel":1867},"https:\u002F\u002Fwww.happiestbaby.com\u002Fproducts\u002Fthe-happiest-baby-book-paperback",[1123],"The Happiest Baby on the Block, by Harvey Karp",[122,1870,1871],{},[1119,1872,1875],{"href":1873,"rel":1874},"https:\u002F\u002Fpublications.aap.org\u002Faapbooks\u002Fbook\u002F568\u002FCaring-for-Your-Baby-and-Young-Child-Birth-to-Age",[1123],"Caring for Your Baby and Young Child, 7th Edition: Birth to Age 5 by American Academy of Pediatrics",[111,1877,1293],{"id":1292},[191,1879,9],{"id":1296},[107,1881,1882,1883,1886],{},"As of the first of the year 2023, I've been working at ",[1119,1884,9],{"href":1576,"rel":1885},[1123]," for a full year and what a great experience it has been. Steve and Michelle Smith run an amazing group of individuals and I couldn't be happier to be a part of the team. I've grown my knowledge on a ton of topics including domain-driven design, test-driven development, and event-driven architectures and I'm excited to see what the future holds for me at NimblePros. The team has a plethora of collective knowledge on modern .NET development, CI\u002FCD, design patterns, and architecture. I enjoy getting to absorb some of that knowledge while contributing my own insights and experiences to the ecosystem. One interesting challenge this role has presented is adapting to consulting with various clients versus being an internal employee embedded in a particular product and organization. This is a new type of skill set for me in my career and was an adjustment in how I had to manage my time. It also affected how I went about communicating concerns and ideas. I've grown because of this new role in ways I didn't expect to which has been rewarding in hindsight. If you're looking for a great team to work with, I highly recommend checking out NimblePros! We're hiring!",[191,1888,1303],{"id":1302},[107,1890,1891],{},"2022 was my biggest year ever in terms of contributions on GitHub as most of my client work has been on private GitHub repositories. Another factor is my ability to contribute to open-source projects including the NimblePros, devBetter, and Ardalis repositories. Having the flexibility and influence to identify bugs or enhancements to Steve's open-source packages and contribute to them as part of my daily work is so rewarding. I'm excited to see what 2023 brings in terms of my open-source contributions.",[107,1893,1894],{},[1112,1895],{"alt":1311,"src":1896},"\u002F2022-yearly-github-contributions.png",[191,1898,1900],{"id":1899},"csharpfunctionalextensionsfluentassertions","CSharpFunctionalExtensions.FluentAssertions",[107,1902,1903,1904,1909,1910,1914,1915,1920,1921,1926],{},"In early 2022, I paired up with ",[1119,1905,1908],{"href":1906,"rel":1907},"https:\u002F\u002Ftwitter.com\u002Fseangwright",[1123],"Sean Wright"," to create my first NuGet package ",[1119,1911,1900],{"href":1912,"rel":1913},"https:\u002F\u002Fgithub.com\u002FNitroDevs\u002FCSharpFunctionalExtensions.FluentAssertions",[1123],". This package is a simple extension to the ",[1119,1916,1919],{"href":1917,"rel":1918},"https:\u002F\u002Fgithub.com\u002Fvkhorikov\u002FCSharpFunctionalExtensions",[1123],"CSharpFunctionalExtensions"," library providing support for ",[1119,1922,1925],{"href":1923,"rel":1924},"https:\u002F\u002Ffluentassertions.com\u002F",[1123],"FluentAssertions"," for a lot of use cases that one might encounter when using the library. This was a great way to develop my understanding of CSharpFunctionalExtensions while also solidifying my experience with FluentAssertions.",[191,1928,1930],{"id":1929},"fshoponweb-and-f-contributions","FShopOnWeb and F# Contributions",[107,1932,1933,1934,1939,1940,1945,1946,1951],{},"In the fall of this year, Sean Wright and I onced again paired up to start a new project ",[1119,1935,1938],{"href":1936,"rel":1937},"https:\u002F\u002Fgithub.com\u002FNitroDevs\u002FFShopOnWeb",[1123],"FShopOnWeb"," as an F# take on Microsoft's ",[1119,1941,1944],{"href":1942,"rel":1943},"https:\u002F\u002Fgithub.com\u002Fdotnet-architecture\u002FeShopOnWeb",[1123],"eShopOnWeb"," reference application. We've been working on it in our spare time and have made some great progress. It's been a rewarding experience learning F# as a C# developer. The path has shown me new patterns and paradigms that have helped grow my knowledge in a more functional direction while also allowing me to explore .NET from another perspective. Sean and I even contributed to the ",[1119,1947,1950],{"href":1948,"rel":1949},"https:\u002F\u002Fblog.nimblepros.com\u002Fblogs\u002Feverything-is-functions\u002F",[1123],"F# Advent Calender Blog"," describing our experiences which is something I don't think either of us would have expected to do if you had asked us a year ago. I'm excited to see where this project goes and I'm looking forward to contributing more to the F# community in 2023.",[191,1953,1315],{"id":62},[107,1955,1956],{},"In 2022, I wrote a total of 11 blog posts which is 11 more than I wrote in 2021 📈😂. I'm hoping to continue this trend in 2023 by at least writing one per month minimum. My stretch goal would be to write 20 total by increasing more posts on more diverse topics on my personal blog while also growing my efforts on technical topics on the NimblePros blog. Blogging has become a nice way to reflect on my experiences and share my knowledge with others while also documenting issues for future reference for myself.",[107,1958,1321,1959,1238],{},[1119,1960,1326],{"href":1324,"rel":1961},[1123],[191,1963,1965],{"id":1964},"work-environment","Work environment",[107,1967,1968],{},"One of the great things about buying a home was I was finally able to invest in a home office space that I knew I would be able to enjoy and benefit from for many years. After settling in to my home for a few months, I decided to upgrade my office by getting an Uplift V2 standing desk and a 49-inch ultrawide monitor. Along with a few smaller items like a Jabra 510 UC speakerphone, my productivity and comfort have increased significantly. These items have made a huge difference in my work environment and have solidified my belief that investing in your work environment is a worthwhile endeavor if you are financially able to or have financial assistance from your employer to do so. There is definitely a case to be made for some of these items in terms of employee productivity so try to reach out to your employer to see if they have any programs in place to help you out. Again, feeling very blessed to have the support of my employer to help me out with this.",[111,1970,1972],{"id":1971},"looking-forward-to-2023","Looking forward to 2023",[107,1974,1975],{},"This year was one of the best and brightest in my life and I'm incredibly happy with the milestones I've hit both professionally and personally. As I look ahead to 2023, the process of setting goals feels different from previous years now that I'm raising a child and I can appreciate having goals for both myself as a parent as well as professional accomplishments I wish to achieve. I have no plans of slowing down but I welcome the balance of this new dynamic in my life. I'm excited to see what the future holds for me and my family and I'm looking forward to sharing all of my progress with you all.",{"title":68,"searchDepth":69,"depth":69,"links":1977},[1978,1979,1982,1990],{"id":1241,"depth":69,"text":1242},{"id":1255,"depth":69,"text":1256,"children":1980},[1981],{"id":1265,"depth":1047,"text":1266},{"id":1292,"depth":69,"text":1293,"children":1983},[1984,1985,1986,1987,1988,1989],{"id":1296,"depth":1047,"text":9},{"id":1302,"depth":1047,"text":1303},{"id":1899,"depth":1047,"text":1900},{"id":1929,"depth":1047,"text":1930},{"id":62,"depth":1047,"text":1315},{"id":1964,"depth":1047,"text":1965},{"id":1971,"depth":69,"text":1972},"2023-01-15T00:00:00.000Z","Reflection on my experiences in the year 2022",{},{"title":30,"description":1992},"HhkbLg8AEEw5EbSWbMD6ib33zWiVby7QbfC6JUY0oq0",{"id":1997,"title":26,"body":1998,"date":2188,"description":2189,"extension":72,"head":71,"image":2005,"keywords":71,"layout":71,"meta":2190,"navigation":11,"path":27,"seo":2191,"stem":28,"__hash__":2192},"blog\u002Fblog\u002F3.announcing-csharpfunctionalextensions-fluentassertions.md",{"type":57,"value":1999,"toc":2183},[2000,2006,2022,2026,2032,2094,2097,2112,2135,2139,2163,2165,2179],[107,2001,2002],{},[1112,2003],{"alt":2004,"src":2005},"Announcing the CSharpFunctionalExtensions.FluentAssertions library","\u002FAnnouncing-the-CSharpFunctionalExtensions-FluentAssertions-library.png",[107,2007,2008,2009,2013,2014,1497,2018,2021],{},"Version 1.0.0 of ",[1119,2010,1900],{"href":2011,"rel":2012},"https:\u002F\u002Fwww.nuget.org\u002Fpackages\u002FCSharpFunctionalExtensions.FluentAssertions",[1123]," is now available on NuGet! This package enables developers to increase the readability of their tests by providing a more fluent way to write assertions based on common types such as ",[2015,2016,2017],"code",{},"Maybe\u003CT>",[2015,2019,2020],{},"Result"," from the CSharpFunctionalExtensions library.",[111,2023,2025],{"id":2024},"an-example-from-csharpfunctionalextensionsfluentassertions","An Example from CSharpFunctionalExtensions.FluentAssertions",[107,2027,2028,2029,2031],{},"Let's take a look at what a xUnit test method with an assertion on a ",[2015,2030,2017],{}," object might look like first without and then with this new library.",[2033,2034,2038],"pre",{"className":2035,"code":2036,"language":2037,"meta":68,"style":68},"language-csharp shiki shiki-themes github-dark github-light","[Fact]\npublic void MaybeShouldHaveValue()\n{\n  int value = 4680;\n  var maybe = Maybe.From(value);\n\n  maybe.Value.Should().NotBeNull();\n  maybe.Value.Should().Be(value); \n}\n","csharp",[2015,2039,2040,2048,2053,2058,2064,2070,2076,2082,2088],{"__ignoreMap":68},[2041,2042,2045],"span",{"class":2043,"line":2044},"line",1,[2041,2046,2047],{},"[Fact]\n",[2041,2049,2050],{"class":2043,"line":69},[2041,2051,2052],{},"public void MaybeShouldHaveValue()\n",[2041,2054,2055],{"class":2043,"line":1047},[2041,2056,2057],{},"{\n",[2041,2059,2061],{"class":2043,"line":2060},4,[2041,2062,2063],{},"  int value = 4680;\n",[2041,2065,2067],{"class":2043,"line":2066},5,[2041,2068,2069],{},"  var maybe = Maybe.From(value);\n",[2041,2071,2073],{"class":2043,"line":2072},6,[2041,2074,2075],{"emptyLinePlaceholder":11},"\n",[2041,2077,2079],{"class":2043,"line":2078},7,[2041,2080,2081],{},"  maybe.Value.Should().NotBeNull();\n",[2041,2083,2085],{"class":2043,"line":2084},8,[2041,2086,2087],{},"  maybe.Value.Should().Be(value); \n",[2041,2089,2091],{"class":2043,"line":2090},9,[2041,2092,2093],{},"}\n",[107,2095,2096],{},"With the reference to the CSharpFunctionalExtensions.FluentAssertions library, the assertion of the test method can be changed to the following.",[2033,2098,2100],{"className":2035,"code":2099,"language":2037,"meta":68,"style":68},"maybe.Should().HaveSomeValue();\nmaybe.Should().HaveValue(value);\n",[2015,2101,2102,2107],{"__ignoreMap":68},[2041,2103,2104],{"class":2043,"line":2044},[2041,2105,2106],{},"maybe.Should().HaveSomeValue();\n",[2041,2108,2109],{"class":2043,"line":69},[2041,2110,2111],{},"maybe.Should().HaveValue(value);\n",[107,2113,2114,2115,2120,2121,1600,2123,1600,2125,1600,2128,1606,2131,2134],{},"You can check out other sample usages of the CSharpFunctionalExtensions.FluentAssertions library in the ",[1119,2116,2119],{"href":2117,"rel":2118},"https:\u002F\u002Fgithub.com\u002FNitroDevs\u002FCSharpFunctionalExtensions.FluentAssertions#usage",[1123],"Usage"," section of the project's readme. The library contains FluentAssertion extensions for ",[2015,2122,2017],{},[2015,2124,2020],{},[2015,2126,2127],{},"Result\u003CT>",[2015,2129,2130],{},"Result\u003CT, E>",[2015,2132,2133],{},"UnitResult\u003CE>"," types.",[111,2136,2138],{"id":2137},"closing-remarks","Closing Remarks",[107,2140,2141,2142,2147,2148,2152,2153,2156,2157,2162],{},"This package was motivated by some of the tests I have been writing for ",[1119,2143,2146],{"href":2144,"rel":2145},"https:\u002F\u002Fgithub.com\u002FKyleMcMaster\u002Fpayroll-processor",[1123],"payroll processor"," as I refactor that codebase from LanguageExt to CSharpFunctionalExtensions. This project's success should also be strongly attributed to the contributions by ",[1119,2149,2151],{"href":1906,"rel":2150},[1123],"Sean"," Wright](",[1119,2154,1906],{"href":1906,"rel":2155},[1123],") for helping me through the process of publishing a NuGet package for the first time and establishing an automated deployment pipeline with the ability to generate a preview package easily. Give him a follow on Twitter! I'd also like to thank ",[1119,2158,2161],{"href":2159,"rel":2160},"https:\u002F\u002Fgithub.com\u002FMrBogomips",[1123],"Giovanni Costagliola"," for being the first community contributor to this project.",[111,2164,1521],{"id":1520},[119,2166,2167,2173],{},[122,2168,2169],{},[1119,2170,2172],{"href":1912,"rel":2171},[1123],"GitHub Repository",[122,2174,2175],{},[1119,2176,2178],{"href":2011,"rel":2177},[1123],"Package on NuGet",[2180,2181,2182],"style",{},"html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}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);}",{"title":68,"searchDepth":69,"depth":69,"links":2184},[2185,2186,2187],{"id":2024,"depth":69,"text":2025},{"id":2137,"depth":69,"text":2138},{"id":1520,"depth":69,"text":1521},"2022-10-15T00:00:00.000Z","Overview of the new library providing FluentAssertions for CSharpFunctionalExtensions. Now available on NuGet!",{},{"title":26,"description":2189},"w6rN2Xw6_uEqMgCYu09-6tusJTfXbfYfEQs8tCspas4",{"id":2194,"title":22,"body":2195,"date":2290,"description":2291,"extension":72,"head":2292,"image":2201,"keywords":2305,"layout":71,"meta":2316,"navigation":11,"path":23,"seo":2317,"stem":24,"__hash__":2318},"blog\u002Fblog\u002F2.introducing-payroll-processor.md",{"type":57,"value":2196,"toc":2283},[2197,2202,2209,2213,2221,2225,2239,2242,2246,2271,2275,2278,2280],[107,2198,2199],{},[1112,2200],{"alt":22,"src":2201},"\u002Fintroducing-payroll-processor.png",[107,2203,2204,2208],{},[1119,2205,2207],{"href":2144,"rel":2206},[1123],"Payroll Processor"," is a open source project I started in May of 2019. The general idea of the domain is from the perspective of a payroll coordinator who manages employees of a company and their payroll information. It has been a rewarding experience creating the application and working with my fellow contributors. It's long overdue but I felt the project deserved a blog post reviewing it's history and celebrating some of the modest successes it has achieved.",[111,2210,2212],{"id":2211},"humble-beginnings","Humble Beginnings",[107,2214,2215,2216,2220],{},"In May of 2019, I was traveling home from ngConf riding the wave of excitement and eagerly looking to expand on some of the topics I had listened to during my attendence. Being a primarily .NET focused developer at the time, I was looking for a way to grow my front end skills and gain experience with Angular. As with most side projects, I quickly scaffolded out a few small features before hitting a few roadblocks while hacking together HTTP requests, debugging RxJS, and piecing together CSS until things \"worked\". As development slowed, the project sat for the better part of a year until a renewed interest in the project came in early February 2020. A few weeks later, Covid restrictions allowed many to begin working remotely. This freed up time for me that would have been spent commuting and allowed me to pursue the project more consistently. Around this same time, a good friend and mentor of mine ",[1119,2217,1908],{"href":2218,"rel":2219},"https:\u002F\u002Fwww.seangwright.me\u002F",[1123]," became interested in the project and wanted to implement the backend using functional programming patterns with event sourcing and CQRS. Having multiple contributors accelerated development and allowed us both to pursue technologies we had been interested in while formalizing a clear roadmap for the project's initial implementation.",[111,2222,2224],{"id":2223},"project-structure-and-technologies","Project Structure and Technologies",[107,2226,2227,2228,1497,2233,2238],{},"The first iteration of the project consisted of 3 primary components: a .NET Core Web API, an Azure Functions project, and an Angular application. The project was configured to use VS Code's Multi-root Workspaces which enabled a cohesive development experience inside VS Code. The .NET Core Web API is built using practices from Clean Architecture and Vertical Slice Architecture with technologies like Steve \"Ardalis\" Smith's ",[1119,2229,2232],{"href":2230,"rel":2231},"https:\u002F\u002Fgithub.com\u002Fardalis\u002FApiEndpoints",[1123],"ApiEndpoints",[1119,2234,2237],{"href":2235,"rel":2236},"https:\u002F\u002Fgithub.com\u002Fardalis\u002FGuardClauses",[1123],"GuardClauses"," as well as LanguageExt, and CosmosDB. The Azure Functions allowed us to explore asynchronous message handling with Azure Queue Storage and SignalR. Developing the Angular application allowed me to grow my knowledge of Angular best practices and gain familiarity with RxJS and Akita State Management.",[107,2240,2241],{},"This initial phase of building the application exposed me to a smorgasboard of modern web technologies. It really gave the project momentum as it was exciting solving problems in this domain utilizing new frameworks and patterns. With time, the project grew to include implementations of CI\u002FCD using GitHub actions, utilizing Bogus for data generation, and Azure Bicep for infrastructure as code.",[111,2243,2245],{"id":2244},"contributors","Contributors",[107,2247,2248,2249,2254,2255,1600,2260,1497,2265,2270],{},"I have to give a shout out to my fellow contributors and friends for their insights and inspirations. First, Sean G. Wright was absolutely instrumental to the project's success. Payroll Processor simply wouldn't be where it is today without his contributions. Having him to bounce ideas off of made the project rewarding and held me accountable for contributing on days when I would lose interest. I'd like to thank ",[1119,2250,2253],{"href":2251,"rel":2252},"https:\u002F\u002Fconklin.dev\u002F",[1123],"Justin Conklin"," for assisting me with his HTML and CSS talents. Finally, I'd like to thank ",[1119,2256,2259],{"href":2257,"rel":2258},"https:\u002F\u002Fgithub.com\u002FJonathanKeppler",[1123],"Jonathan Keppler",[1119,2261,2264],{"href":2262,"rel":2263},"http:\u002F\u002Fwww.davidedmiston.com\u002F",[1123],"David Edmiston",[1119,2266,2269],{"href":2267,"rel":2268},"https:\u002F\u002Fgithub.com\u002Ffeaturesnap",[1123],"Pat Kelly"," for their feedback and allowing me to pick their brain on different approaches and patterns.",[111,2272,2274],{"id":2273},"roadmap","Roadmap",[107,2276,2277],{},"As I look forward, there are many technologies I am excited about trying out inside this application's ecosystem. For local development, implementing Project Tye orchestrations would be useful for quickly running the applications. I'd like to pursue adding administration features to the domain implemented in a separate SPA using Vue3 and TailwindCSS. The existing Angular app's theme could use an overhaul along with an opportunity to review accessibility practices in semantic HTML. Expanding the Continuous Deployment process to use the existing Azure Bicep scripts as a foundation would be a great way to setup for automated integration testing and eventually get a live version of the site up and running. I've been slowly piecing together a formal roadmap for the future of the project and would love to get feedback on what I can do to make it a better reference application for those that are interested.",[111,2279,2138],{"id":2137},[107,2281,2282],{},"Payroll Processor has grown to have 73 stars on GitHub which is larger than I had ever anticipated. I'm proud of the project and I'm excited to see what the future holds for it. It's great to have a sandbox application to test new technologies or patterns. I encourage others who are looking to grow their skills to pursue building side projects like this on their own or with a friend. Please feel free to reach out on Twitter if you are interested in contributing and checkout the issues page for open issues and feature requests.",{"title":68,"searchDepth":69,"depth":69,"links":2284},[2285,2286,2287,2288,2289],{"id":2211,"depth":69,"text":2212},{"id":2223,"depth":69,"text":2224},{"id":2244,"depth":69,"text":2245},{"id":2273,"depth":69,"text":2274},{"id":2137,"depth":69,"text":2138},"2022-04-13T00:00:00.000Z","Open source .NET application built with modern software architecture patterns including functional programming, event sourcing, CQRS, and asynchronous processing",{"meta":2293},[2294,2295,2296,2297,2298,2299,2301,2303],{"name":83,"content":84},{"name":1187,"content":1188},{"property":86,"content":1190},{"property":1192,"content":84},{"property":1194,"content":2290},{"property":1196,"content":2300},"Software Architecture",{"property":1196,"content":2302},"Open Source",{"property":1196,"content":2304},".NET Development",[2306,2307,2308,2309,2310,2311,1208,2312,2313,1211,2314,2315],"open source",".NET development","C# programming","functional programming","event sourcing","CQRS","asynchronous processing","modern .NET","domain driven design","payroll system",{},{"title":22,"description":2291},"xA0AXpwlZSHh8ta1Xt4qZZ0zedTd7ft36PRndtyr9us",{"id":2320,"title":18,"body":2321,"date":2437,"description":2438,"extension":72,"head":71,"image":2327,"keywords":71,"layout":71,"meta":2439,"navigation":11,"path":19,"seo":2440,"stem":20,"__hash__":2441},"blog\u002Fblog\u002F1.2021-year-in-review.md",{"type":57,"value":2322,"toc":2430},[2323,2328,2335,2337,2340,2343,2374,2377,2385,2391,2412,2416,2423,2427],[107,2324,2325],{},[1112,2326],{"alt":18,"src":2327},"\u002F2021-year-in-review.png",[107,2329,2330,2331,2334],{},"In the spirit of the new year and looking ahead at future goals, I've decided to do a year in review post highlighting my last 12 months of work and personal life. I recently read this ",[1119,2332,1231],{"href":1229,"rel":2333},[1123]," which further motivated me to commit to writing more for my blog and gave me a few ideas on how to structure my writing.",[111,2336,1242],{"id":1241},[107,2338,2339],{},"Last year was a big one for me in my personal life! I got married over the summer and bought a house in the fall. Looking back the timing of our wedding was perfect as Covid numbers had dipped and allowed us to have a small but fun outdoor ceremony. With the purchase of a home, I'm excited to have some side projects to accomplish that are non-technical and to work away from the keyboard for a bit. We'll see if that excitement holds through remodeling our kitchen!",[111,2341,2342],{"id":1255},"Books I Read",[107,2344,2345,2346,2349,2350,2355,2356,2359,2360,2364,2365,2368,2369,2373],{},"During the summer, I try to focus on getting outdoors as much as possible. Reading books are a great way to do this while still progressing my technical skills, so I picked up a few to keep me busy. In my workplace, I knew I had a few processes that could benefit from ",[2015,2347,2348],{},"Refactoring: Improving the Design of Existing Code"," by Martin Fowler (",[1119,2351,2354],{"href":2352,"rel":2353},"https:\u002F\u002Fmartinfowler.com\u002Fbooks\u002Frefactoring.html",[1123],"link",") so I was eager to read that one and apply the strategies as I read the book. As a newer lead developer familiar with SOLID principles, I was also intrigued to read ",[2015,2357,2358],{},"Clean Architecture: A Craftsman's Guide to Software Structure and Design"," by Robert C. Martin (",[1119,2361,2354],{"href":2362,"rel":2363},"https:\u002F\u002Fwww.informit.com\u002Fstore\u002Fclean-architecture-a-craftsmans-guide-to-software-structure-9780134494166",[1123],") and ",[2015,2366,2367],{},"Design Patterns: Elements of Reusable Object-Oriented Software"," by GoF (",[1119,2370,2354],{"href":2371,"rel":2372},"https:\u002F\u002Fwww.informit.com\u002Fstore\u002Fdesign-patterns-elements-of-reusable-object-oriented-9780201633610",[1123],") as I wanted to make sure I was making more informed choices about the design of my systems and improve my ability to recognize and apply design patterns. Although I didn't finish every page of these books, I really enjoyed reading them and will continue to reference them in the future.",[111,2375,2376],{"id":1302},"Github Contributions",[107,2378,2379,2380,2384],{},"Last year my overall number of contributions for 2021 were lower than 2020, but I'm still proud of the activity I accomplished. I actively maintained my primary side project and reference application ",[1119,2381,2383],{"href":2144,"rel":2382},[1123],"payroll-processor"," and saw consistent growth on the number of stars on that project. I can't believe it has over 50 now! Some of my favorite highlights for that project were upgrading it to Angular 13, .NET 6, and Azure Functions v4.",[107,2386,2387],{},[1112,2388],{"alt":2389,"src":2390},"KyleMcMaster's 2021 GitHubWrap","..\u002Fassets\u002Fimages\u002F2021_gh_wrap_og_image.png",[107,2392,2393,2394,2399,2400,2405,2406,2411],{},"I also made some small contributions to a few OSS projects this year that were rewarding. Although my singular contribution to this project was small, I have really enjoyed following along Sean G. Wright's ",[1119,2395,2398],{"href":2396,"rel":2397},"https:\u002F\u002Fgithub.com\u002Fseangwright\u002Ftypescript-functional-extensions",[1123],"TypeScript implementation"," of CSharpFunctionalExtensions. This year in particular I also published a lot of my kata exercises which was rewarding to compare implementations between attempts. My favorite kata of 2021 was definitely the ",[1119,2401,2404],{"href":2402,"rel":2403},"https:\u002F\u002Fgithub.com\u002Fardalis\u002Fkata-catalog\u002Fblob\u002Fmain\u002Fkatas\u002FTennis%20Scoring.md",[1123],"Tennis Kata"," and I really enjoyed attempting this kata in F# after reading Mark Seeman's series of blog ",[1119,2407,2410],{"href":2408,"rel":2409},"https:\u002F\u002Fblog.ploeh.dk\u002F2021\u002F03\u002F29\u002Ftable-driven-tennis-scoring\u002F",[1123],"posts"," that demonstrate a variety of ways to solve the exercise.",[111,2413,2415],{"id":2414},"professional-accomplishments","Professional Accomplishments",[107,2417,2418,2419,2422],{},"2021 was a busy year for me professionally. I attended virtual meetups, participated in frequent katas, and lead more training exercises than previous years. My role shifted in 2021 as I adjusted to being a team lead and this allowed me to spend more time navigating the Azure portal focusing on application stability and monitoring. Thinking back on the year at a technical level, I learned a lot about CI\u002FCD and was introduced to Azure ARM templates. A project at the beginning of the year also gave me the opportunity to implement event sourcing using Azure Service Bus queues and topics alongside Azure Function Service Bus triggers which was an awesome experience and is something I hope to develop again in the future. Towards the end of the year, I had accepted an offer for a position at ",[1119,2420,9],{"href":1576,"rel":2421},[1123]," so I spent my remaining time at Park Place Technologies focused on documentation, diagramming, and training which was rewarding to refine those skills. I've recently become a big fan of the draw.io extension in Visual Studio Code!",[111,2424,2426],{"id":2425},"looking-forward-to-2022","Looking forward to 2022",[107,2428,2429],{},"This year I'm really focused on improving my technical writing skills, both by writing blogs and producing more documentation for projects I work on. I would also like to continue to grow my front end development skills as I still feel I have room to improve in CSS and HTML as well as improving my knowledge of modern javascript frameworks like Vue and Angular. At the end of the day, learning new things helps me stay motivated and engaged. Regardless of what the future may bring I know I'll continue trying new things and hopefully having some fun along the way! I know I'm a few days late to post this but welcome to 2022! Hope everyone is off to a great start for the new year!",{"title":68,"searchDepth":69,"depth":69,"links":2431},[2432,2433,2434,2435,2436],{"id":1241,"depth":69,"text":1242},{"id":1255,"depth":69,"text":2342},{"id":1302,"depth":69,"text":2376},{"id":2414,"depth":69,"text":2415},{"id":2425,"depth":69,"text":2426},"2022-01-06T00:00:00.000Z","Reflection on my experiences in the year 2021",{},{"title":18,"description":2438},"435yYmvHt-qbEBZFNT9ZPCDqOSiHtiCiUrGcrnWdCQU",1786745735831]