[{"data":1,"prerenderedAt":1730},["ShallowReactive",2],{"post-\u002Fposts\u002Ftesting-is-more-larger-than-just-writing-some-tests":3,"post-link-en-08852918-9829-4658-97b3-1aabede8e9fe":1270},{"id":4,"title":5,"body":6,"contentId":1254,"date":1255,"description":1256,"extension":1257,"meta":1258,"navigation":216,"path":1259,"rawbody":1260,"robots":1261,"schemaOrg":1261,"seo":1262,"sitemap":1263,"stem":1268,"__hash__":1269},"posts\u002Fposts\u002Ftesting-is-more-larger-than-just-writing-some-tests.md","Testing is More Larger Than Just Writing Some Tests",{"type":7,"value":8,"toc":1251},"minimark",[9,20,23,26,115,123,126,131,134,141,165,692,699,964,970,976,985,988,1000,1007,1010,1026,1032,1038,1044,1050,1053,1060,1071,1074,1077,1080,1247],[10,11,12],"blockquote",{},[13,14,15,19],"p",{},[16,17,18],"span",{},"!NOTE","\nI am not a testing expert. I am merely sharing my thoughts on testing as a developer, in an article I would have appreciated when I began coding.",[13,21,22],{},"I started coding six years ago. Since then, I've heard a lot about testing, but I have seen few real and practical examples.",[13,24,25],{},"In many articles I read, tests look like this:",[27,28,33],"pre",{"className":29,"code":30,"language":31,"meta":32,"style":32},"language-js shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","it('should return 2 when 1 + 1', () => {\n  expect(1 + 1).toBe(2)\n})\n","js","",[34,35,36,71,107],"code",{"__ignoreMap":32},[16,37,40,44,48,52,56,58,61,64,68],{"class":38,"line":39},"line",1,[16,41,43],{"class":42},"s2Zo4","it",[16,45,47],{"class":46},"sTEyZ","(",[16,49,51],{"class":50},"sMK4o","'",[16,53,55],{"class":54},"sfazB","should return 2 when 1 + 1",[16,57,51],{"class":50},[16,59,60],{"class":50},",",[16,62,63],{"class":50}," ()",[16,65,67],{"class":66},"spNyl"," =>",[16,69,70],{"class":50}," {\n",[16,72,74,77,80,84,87,90,93,96,99,101,104],{"class":38,"line":73},2,[16,75,76],{"class":42},"  expect",[16,78,47],{"class":79},"swJcz",[16,81,83],{"class":82},"sbssI","1",[16,85,86],{"class":50}," +",[16,88,89],{"class":82}," 1",[16,91,92],{"class":79},")",[16,94,95],{"class":50},".",[16,97,98],{"class":42},"toBe",[16,100,47],{"class":79},[16,102,103],{"class":82},"2",[16,105,106],{"class":79},")\n",[16,108,110,113],{"class":38,"line":109},3,[16,111,112],{"class":50},"}",[16,114,106],{"class":46},[13,116,117,118,122],{},"This is ",[119,120,121],"strong",{},"far from real-world scenarios"," and does not help in understanding the true value of testing.",[13,124,125],{},"I have to admit, when I don't comprehend something, I avoid using it. Nevertheless, since I first encountered the concept of testing, it has lingered in my mind, prompting me to gather knowledge about it.",[127,128,130],"h2",{"id":129},"a-long-journey","A long journey",[13,132,133],{},"I first heard about testing when I learned Vue 2 in 2019. In the tooling section, under the \"Single File Component\" page, I found a section dedicated to \"Testing.\"",[13,135,136,137],{},"I think I read the beginning of the page but never went further. There were too many new concepts to grasp, too many tools to learn, and too many choices to make. ",[138,139,140],"em",{},"At that time, I understood that front-end testing is by far the most challenging part of testing.",[13,142,143,144,151,152,157,158,161,162],{},"In 2020, with some friends, we developed a tutoring platform. The API server was built with ",[145,146,150],"a",{"href":147,"rel":148},"https:\u002F\u002Fcrow.docs.feathersjs.com\u002F",[149],"nofollow","Feathers.js 4",". At that time, I was still grappling with testing. I remember looking for ",[145,153,156],{"href":154,"rel":155},"https:\u002F\u002Fcrow.docs.feathersjs.com\u002Fguides\u002Fbasics\u002Ftesting.html#writing-tests",[149],"the testing page in the Feathers.js documentation"," and even reading it. Despite not fully understanding it, I wrote many tests. It was a real struggle because the distinction between unit tests and integration tests was unclear to me, and running them in a CI was very difficult. ",[138,159,160],{},"I was using MongoDB and Azure CI. Looking back, I think I wanted to endure pain."," I also remember trying to achieve 100% coverage. ",[138,163,164],{},"I was so naive.",[27,166,170],{"className":167,"code":168,"language":169,"meta":32,"style":32},"language-ts shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","it('should patch', async () => {\n  expect.assertions(5)\n\n  const patchedResult: Department = await app\n    .service(serviceName)\n    .patch(result._id, anotherDepartment)\n\n  expect(patchedResult).toBeDefined()\n  expect(patchedResult).toHaveProperty('_id')\n  expect(patchedResult).toHaveProperty(\n    'name',\n    anotherDepartment.name.toLowerCase()\n  )\n  expect(patchedResult).toHaveProperty('createdAt')\n  expect(patchedResult).toHaveProperty('updatedAt')\n})\n\nit('should delete', async () => {\n  expect.assertions(5)\n\n  const deleteResult: Department = await app\n    .service(serviceName)\n    .remove(result._id)\n\n  expect(deleteResult).toBeDefined()\n  expect(deleteResult).toHaveProperty('_id')\n  expect(deleteResult).toHaveProperty('name', result.name.toLowerCase())\n  expect(deleteResult).toHaveProperty('createdAt')\n  expect(deleteResult).toHaveProperty('updatedAt')\n})\n","ts",[34,171,172,196,212,218,244,260,285,290,310,336,354,368,385,391,417,443,450,455,479,494,499,517,530,548,553,571,596,635,660,685],{"__ignoreMap":32},[16,173,174,176,178,180,183,185,187,190,192,194],{"class":38,"line":39},[16,175,43],{"class":42},[16,177,47],{"class":46},[16,179,51],{"class":50},[16,181,182],{"class":54},"should patch",[16,184,51],{"class":50},[16,186,60],{"class":50},[16,188,189],{"class":66}," async",[16,191,63],{"class":50},[16,193,67],{"class":66},[16,195,70],{"class":50},[16,197,198,200,202,205,207,210],{"class":38,"line":73},[16,199,76],{"class":46},[16,201,95],{"class":50},[16,203,204],{"class":42},"assertions",[16,206,47],{"class":79},[16,208,209],{"class":82},"5",[16,211,106],{"class":79},[16,213,214],{"class":38,"line":109},[16,215,217],{"emptyLinePlaceholder":216},true,"\n",[16,219,221,224,227,230,234,237,241],{"class":38,"line":220},4,[16,222,223],{"class":66},"  const",[16,225,226],{"class":46}," patchedResult",[16,228,229],{"class":50},":",[16,231,233],{"class":232},"sBMFI"," Department",[16,235,236],{"class":50}," =",[16,238,240],{"class":239},"s7zQu"," await",[16,242,243],{"class":46}," app\n",[16,245,247,250,253,255,258],{"class":38,"line":246},5,[16,248,249],{"class":50},"    .",[16,251,252],{"class":42},"service",[16,254,47],{"class":79},[16,256,257],{"class":46},"serviceName",[16,259,106],{"class":79},[16,261,263,265,268,270,273,275,278,280,283],{"class":38,"line":262},6,[16,264,249],{"class":50},[16,266,267],{"class":42},"patch",[16,269,47],{"class":79},[16,271,272],{"class":46},"result",[16,274,95],{"class":50},[16,276,277],{"class":46},"_id",[16,279,60],{"class":50},[16,281,282],{"class":46}," anotherDepartment",[16,284,106],{"class":79},[16,286,288],{"class":38,"line":287},7,[16,289,217],{"emptyLinePlaceholder":216},[16,291,293,295,297,300,302,304,307],{"class":38,"line":292},8,[16,294,76],{"class":42},[16,296,47],{"class":79},[16,298,299],{"class":46},"patchedResult",[16,301,92],{"class":79},[16,303,95],{"class":50},[16,305,306],{"class":42},"toBeDefined",[16,308,309],{"class":79},"()\n",[16,311,313,315,317,319,321,323,326,328,330,332,334],{"class":38,"line":312},9,[16,314,76],{"class":42},[16,316,47],{"class":79},[16,318,299],{"class":46},[16,320,92],{"class":79},[16,322,95],{"class":50},[16,324,325],{"class":42},"toHaveProperty",[16,327,47],{"class":79},[16,329,51],{"class":50},[16,331,277],{"class":54},[16,333,51],{"class":50},[16,335,106],{"class":79},[16,337,339,341,343,345,347,349,351],{"class":38,"line":338},10,[16,340,76],{"class":42},[16,342,47],{"class":79},[16,344,299],{"class":46},[16,346,92],{"class":79},[16,348,95],{"class":50},[16,350,325],{"class":42},[16,352,353],{"class":79},"(\n",[16,355,357,360,363,365],{"class":38,"line":356},11,[16,358,359],{"class":50},"    '",[16,361,362],{"class":54},"name",[16,364,51],{"class":50},[16,366,367],{"class":50},",\n",[16,369,371,374,376,378,380,383],{"class":38,"line":370},12,[16,372,373],{"class":46},"    anotherDepartment",[16,375,95],{"class":50},[16,377,362],{"class":46},[16,379,95],{"class":50},[16,381,382],{"class":42},"toLowerCase",[16,384,309],{"class":79},[16,386,388],{"class":38,"line":387},13,[16,389,390],{"class":79},"  )\n",[16,392,394,396,398,400,402,404,406,408,410,413,415],{"class":38,"line":393},14,[16,395,76],{"class":42},[16,397,47],{"class":79},[16,399,299],{"class":46},[16,401,92],{"class":79},[16,403,95],{"class":50},[16,405,325],{"class":42},[16,407,47],{"class":79},[16,409,51],{"class":50},[16,411,412],{"class":54},"createdAt",[16,414,51],{"class":50},[16,416,106],{"class":79},[16,418,420,422,424,426,428,430,432,434,436,439,441],{"class":38,"line":419},15,[16,421,76],{"class":42},[16,423,47],{"class":79},[16,425,299],{"class":46},[16,427,92],{"class":79},[16,429,95],{"class":50},[16,431,325],{"class":42},[16,433,47],{"class":79},[16,435,51],{"class":50},[16,437,438],{"class":54},"updatedAt",[16,440,51],{"class":50},[16,442,106],{"class":79},[16,444,446,448],{"class":38,"line":445},16,[16,447,112],{"class":50},[16,449,106],{"class":46},[16,451,453],{"class":38,"line":452},17,[16,454,217],{"emptyLinePlaceholder":216},[16,456,458,460,462,464,467,469,471,473,475,477],{"class":38,"line":457},18,[16,459,43],{"class":42},[16,461,47],{"class":46},[16,463,51],{"class":50},[16,465,466],{"class":54},"should delete",[16,468,51],{"class":50},[16,470,60],{"class":50},[16,472,189],{"class":66},[16,474,63],{"class":50},[16,476,67],{"class":66},[16,478,70],{"class":50},[16,480,482,484,486,488,490,492],{"class":38,"line":481},19,[16,483,76],{"class":46},[16,485,95],{"class":50},[16,487,204],{"class":42},[16,489,47],{"class":79},[16,491,209],{"class":82},[16,493,106],{"class":79},[16,495,497],{"class":38,"line":496},20,[16,498,217],{"emptyLinePlaceholder":216},[16,500,502,504,507,509,511,513,515],{"class":38,"line":501},21,[16,503,223],{"class":66},[16,505,506],{"class":46}," deleteResult",[16,508,229],{"class":50},[16,510,233],{"class":232},[16,512,236],{"class":50},[16,514,240],{"class":239},[16,516,243],{"class":46},[16,518,520,522,524,526,528],{"class":38,"line":519},22,[16,521,249],{"class":50},[16,523,252],{"class":42},[16,525,47],{"class":79},[16,527,257],{"class":46},[16,529,106],{"class":79},[16,531,533,535,538,540,542,544,546],{"class":38,"line":532},23,[16,534,249],{"class":50},[16,536,537],{"class":42},"remove",[16,539,47],{"class":79},[16,541,272],{"class":46},[16,543,95],{"class":50},[16,545,277],{"class":46},[16,547,106],{"class":79},[16,549,551],{"class":38,"line":550},24,[16,552,217],{"emptyLinePlaceholder":216},[16,554,556,558,560,563,565,567,569],{"class":38,"line":555},25,[16,557,76],{"class":42},[16,559,47],{"class":79},[16,561,562],{"class":46},"deleteResult",[16,564,92],{"class":79},[16,566,95],{"class":50},[16,568,306],{"class":42},[16,570,309],{"class":79},[16,572,574,576,578,580,582,584,586,588,590,592,594],{"class":38,"line":573},26,[16,575,76],{"class":42},[16,577,47],{"class":79},[16,579,562],{"class":46},[16,581,92],{"class":79},[16,583,95],{"class":50},[16,585,325],{"class":42},[16,587,47],{"class":79},[16,589,51],{"class":50},[16,591,277],{"class":54},[16,593,51],{"class":50},[16,595,106],{"class":79},[16,597,599,601,603,605,607,609,611,613,615,617,619,621,624,626,628,630,632],{"class":38,"line":598},27,[16,600,76],{"class":42},[16,602,47],{"class":79},[16,604,562],{"class":46},[16,606,92],{"class":79},[16,608,95],{"class":50},[16,610,325],{"class":42},[16,612,47],{"class":79},[16,614,51],{"class":50},[16,616,362],{"class":54},[16,618,51],{"class":50},[16,620,60],{"class":50},[16,622,623],{"class":46}," result",[16,625,95],{"class":50},[16,627,362],{"class":46},[16,629,95],{"class":50},[16,631,382],{"class":42},[16,633,634],{"class":79},"())\n",[16,636,638,640,642,644,646,648,650,652,654,656,658],{"class":38,"line":637},28,[16,639,76],{"class":42},[16,641,47],{"class":79},[16,643,562],{"class":46},[16,645,92],{"class":79},[16,647,95],{"class":50},[16,649,325],{"class":42},[16,651,47],{"class":79},[16,653,51],{"class":50},[16,655,412],{"class":54},[16,657,51],{"class":50},[16,659,106],{"class":79},[16,661,663,665,667,669,671,673,675,677,679,681,683],{"class":38,"line":662},29,[16,664,76],{"class":42},[16,666,47],{"class":79},[16,668,562],{"class":46},[16,670,92],{"class":79},[16,672,95],{"class":50},[16,674,325],{"class":42},[16,676,47],{"class":79},[16,678,51],{"class":50},[16,680,438],{"class":54},[16,682,51],{"class":50},[16,684,106],{"class":79},[16,686,688,690],{"class":38,"line":687},30,[16,689,112],{"class":50},[16,691,106],{"class":46},[13,693,694,695,698],{},"But the more I added features to the platform, the more I realized the value of testing. It can ",[119,696,697],{},"ensure that a new feature does not break an existing one"," without the hassle of manually testing everything. This was particularly evident because Feathers.js has many intricate parts and services that can easily break when one part is modified.",[27,700,702],{"className":167,"code":701,"language":169,"meta":32,"style":32},"export default {\n  before: {\n    all: [],\n    find: [],\n    get: [],\n    create: [checkData(checkDataOptions)],\n    update: [disallow()],\n    patch: [checkData(checkDataOptions)],\n    remove: [],\n  },\n\n  after: {\n    all: [],\n    find: [iff(isProvider('external'), pickResult())],\n    get: [iff(isProvider('external'), pickResult())],\n    create: [],\n    update: [],\n    patch: [],\n    remove: [],\n  },\n}\n",[34,703,704,714,723,735,746,757,775,792,807,818,823,827,836,846,883,915,925,935,945,955,959],{"__ignoreMap":32},[16,705,706,709,712],{"class":38,"line":39},[16,707,708],{"class":239},"export",[16,710,711],{"class":239}," default",[16,713,70],{"class":50},[16,715,716,719,721],{"class":38,"line":73},[16,717,718],{"class":79},"  before",[16,720,229],{"class":50},[16,722,70],{"class":50},[16,724,725,728,730,733],{"class":38,"line":109},[16,726,727],{"class":79},"    all",[16,729,229],{"class":50},[16,731,732],{"class":46}," []",[16,734,367],{"class":50},[16,736,737,740,742,744],{"class":38,"line":220},[16,738,739],{"class":79},"    find",[16,741,229],{"class":50},[16,743,732],{"class":46},[16,745,367],{"class":50},[16,747,748,751,753,755],{"class":38,"line":246},[16,749,750],{"class":79},"    get",[16,752,229],{"class":50},[16,754,732],{"class":46},[16,756,367],{"class":50},[16,758,759,762,764,767,770,773],{"class":38,"line":262},[16,760,761],{"class":79},"    create",[16,763,229],{"class":50},[16,765,766],{"class":46}," [",[16,768,769],{"class":42},"checkData",[16,771,772],{"class":46},"(checkDataOptions)]",[16,774,367],{"class":50},[16,776,777,780,782,784,787,790],{"class":38,"line":287},[16,778,779],{"class":79},"    update",[16,781,229],{"class":50},[16,783,766],{"class":46},[16,785,786],{"class":42},"disallow",[16,788,789],{"class":46},"()]",[16,791,367],{"class":50},[16,793,794,797,799,801,803,805],{"class":38,"line":292},[16,795,796],{"class":79},"    patch",[16,798,229],{"class":50},[16,800,766],{"class":46},[16,802,769],{"class":42},[16,804,772],{"class":46},[16,806,367],{"class":50},[16,808,809,812,814,816],{"class":38,"line":312},[16,810,811],{"class":79},"    remove",[16,813,229],{"class":50},[16,815,732],{"class":46},[16,817,367],{"class":50},[16,819,820],{"class":38,"line":338},[16,821,822],{"class":50},"  },\n",[16,824,825],{"class":38,"line":356},[16,826,217],{"emptyLinePlaceholder":216},[16,828,829,832,834],{"class":38,"line":370},[16,830,831],{"class":79},"  after",[16,833,229],{"class":50},[16,835,70],{"class":50},[16,837,838,840,842,844],{"class":38,"line":387},[16,839,727],{"class":79},[16,841,229],{"class":50},[16,843,732],{"class":46},[16,845,367],{"class":50},[16,847,848,850,852,854,857,859,862,864,866,869,871,873,875,878,881],{"class":38,"line":393},[16,849,739],{"class":79},[16,851,229],{"class":50},[16,853,766],{"class":46},[16,855,856],{"class":42},"iff",[16,858,47],{"class":46},[16,860,861],{"class":42},"isProvider",[16,863,47],{"class":46},[16,865,51],{"class":50},[16,867,868],{"class":54},"external",[16,870,51],{"class":50},[16,872,92],{"class":46},[16,874,60],{"class":50},[16,876,877],{"class":42}," pickResult",[16,879,880],{"class":46},"())]",[16,882,367],{"class":50},[16,884,885,887,889,891,893,895,897,899,901,903,905,907,909,911,913],{"class":38,"line":419},[16,886,750],{"class":79},[16,888,229],{"class":50},[16,890,766],{"class":46},[16,892,856],{"class":42},[16,894,47],{"class":46},[16,896,861],{"class":42},[16,898,47],{"class":46},[16,900,51],{"class":50},[16,902,868],{"class":54},[16,904,51],{"class":50},[16,906,92],{"class":46},[16,908,60],{"class":50},[16,910,877],{"class":42},[16,912,880],{"class":46},[16,914,367],{"class":50},[16,916,917,919,921,923],{"class":38,"line":445},[16,918,761],{"class":79},[16,920,229],{"class":50},[16,922,732],{"class":46},[16,924,367],{"class":50},[16,926,927,929,931,933],{"class":38,"line":452},[16,928,779],{"class":79},[16,930,229],{"class":50},[16,932,732],{"class":46},[16,934,367],{"class":50},[16,936,937,939,941,943],{"class":38,"line":457},[16,938,796],{"class":79},[16,940,229],{"class":50},[16,942,732],{"class":46},[16,944,367],{"class":50},[16,946,947,949,951,953],{"class":38,"line":481},[16,948,811],{"class":79},[16,950,229],{"class":50},[16,952,732],{"class":46},[16,954,367],{"class":50},[16,956,957],{"class":38,"line":496},[16,958,822],{"class":50},[16,960,961],{"class":38,"line":501},[16,962,963],{"class":50},"}\n",[13,965,966,967],{},"The complexity of the app grew exponentially, feature after feature. This was more related to the architecture of Feathers.js, but combined with the challenges of writing efficient tests, it was a nightmare to maintain. ",[138,968,969],{},"Each change broke so many tests that I was unsure if the app was working or not.",[13,971,972,973],{},"From that point on, I decided the ability to test the app was a requirement for choosing a new stack. ",[138,974,975],{},"And this will be a long journey because in 2024, I'm still learning a lot but writing more tests than ever.",[13,977,978,979,984],{},"At the beginning of 2021, Strapi was gaining popularity, and I looked at it as a potential replacement for Feathers.js, still to build the tutoring platform. I was pleased to see that Strapi has a ",[145,980,983],{"href":981,"rel":982},"https:\u002F\u002Fdocs.strapi.io\u002Fdev-docs\u002Ftesting",[149],"dedicated page for testing"," in the documentation.",[13,986,987],{},"So, I jumped in and created a new project with Strapi to get started and see if testing was effective.",[13,989,990,991,996,997],{},"Sadly, I immediately ",[145,992,995],{"href":993,"rel":994},"https:\u002F\u002Fgithub.com\u002Fstrapi\u002Fstrapi\u002Fissues\u002F9376",[149],"encountered a problem that never got resolved",". Unable to run tests, I gave up and the tutoring platform was never migrated to Strapi, nor deployed to production. ",[138,998,999],{},"I learned a lot from this side project. Often, the journey is more important than the destination.",[13,1001,1002],{},[1003,1004],"img",{"alt":1005,"src":1006},"Screenshot of this issue 9376","\u002Fposts\u002Ftesting-is-more-larger-than-just-writing-some-tests\u002Fstrapi-testing-issue.png",[13,1008,1009],{},"So let's recap:",[1011,1012,1013,1017,1020,1023],"ul",{},[1014,1015,1016],"li",{},"I only know JavaScript.",[1014,1018,1019],{},"Feathers.js has a complex architecture and poor documentation on testing.",[1014,1021,1022],{},"Strapi has good documentation on testing, but I was unable to run tests.",[1014,1024,1025],{},"I need to find a new side project to learn testing.",[13,1027,1028,1029],{},"Some months later, I heard about AdonisJS. I don't remember how, but at that time, version 5 was in beta. It was a breath of fresh air because the documentation looked very good, and the framework was rich in features. Full of features, yes, but the testing part was not there yet. ",[138,1030,1031],{},"The core team released Japa a year later. It's a pleasant testing framework for Node.js.",[13,1033,1034,1035],{},"Regardless, I learned so much about backend development and architecture with AdonisJS that testing was clearly not a priority. This was the first time I could split features and avoid internal dependencies. Much cleaner and easier to maintain than Feathers.js or NestJS. ",[138,1036,1037],{},"Yes, I also tried NestJS, but this framework is a real joke to me.",[13,1039,1040,1041],{},"By the end of August 2021, I embarked on a new side project called Insamee, a student ecosystem. That was the successor of the tutoring platform. The architecture is important to clarify. Initially, it was an API server with AdonisJS and four front-end apps using Nuxt. ",[138,1042,1043],{},"Overkill and overly complicated, as I realize now.",[13,1045,1046],{},[1003,1047],{"alt":1048,"src":1049},"Screenshot of Insamee","\u002Fposts\u002Ftesting-is-more-larger-than-just-writing-some-tests\u002Finsameeapp.png",[13,1051,1052],{},"By the end of 2021, I rewrote the project from scratch using only Adonis and a single server. No more tests.",[13,1054,1055,1056,1059],{},"I managed to pull myself away from school classes to focus on my project. ",[138,1057,1058],{},"A real opportunity."," To validate my semester, I had to write a report and make a live presentation. During the presentation, I didn't talk about testing (there were none). However, the jury questioned me about it. I just said the runner was not ready yet, so I hadn't written any tests. They took a few minutes to explain that testing is crucial, and I clearly understood that a real and professional project must have tests, it's non-negotiable. In my mind, something clicked.",[13,1061,1062,1063,1066,1067,1070],{},"Subsequently, from April to August 2022, I did a four-month internship at a consulting company in Paris. I was responsible for building, from scratch, an administration panel for a high-performance computing cluster project using Angular 14. This was a first for me. I had never used Angular before. It took me months to grasp the concept of ",[34,1064,1065],{},"TestBed"," and the dependency injection (DI) system. ",[138,1068,1069],{},"I was so lost, but later, I discovered that dependency injection is important."," During that period, I learned concepts but had no real practice.",[13,1072,1073],{},"In 2024, I did my six-month internship at a Swiss cloud company. I was part of a team developing components for other projects. This is where I truly began to appreciate testing. Firstly, the coverage was at 90%. This means if the coverage drops below 90%, you have no other choice than to write tests to submit an MR. The project was eight months old, so there were plenty of tests to reference. I also wrote many end-to-end tests using Playwright.",[13,1075,1076],{},"Simultaneously, I watched a live stream by Romain Lanz discussing \"writing testable code\" and explaining the DI in Adonis. With these explanations and the concrete examples I encountered during my internship, things started to come together and make sense.",[13,1078,1079],{},"This year, at Devoxx 2024, I tried to attend as many talks about TDD and DDD as possible. Hearing experts discuss real-world examples and how they architect their apps to make them testable and future-proof was truly enlightening.",[1081,1082,1084,1087,1104,1117,1123,1129],"callout-read-more",{"id":1083},"08852918-9829-4658-97b3-1aabede8e9fe",[13,1085,1086],{},"Despite all this, I still struggle to find genuine and practical examples of testing. It's so frustrating to know the theory but not be able to apply it.",[13,1088,1089,1090,1095,1096],{},"But I believe that to learn, there is nothing more effective than taking action. So I took the framework I know best, Nuxt, and started experimenting with the ",[145,1091,1094],{"href":1092,"rel":1093},"https:\u002F\u002Fgithub.com\u002Fnuxt\u002Ftest-utils",[149],"available testing tools",". I used the end-to-end integration with Playwright, but it was not a pleasant experience. Tests took so long to run. ",[138,1097,1098,1099,95],{},"Strangely, the experience during my internship felt the opposite. I discovered that the Nuxt integration rebuilds the application before every test. I made ",[145,1100,1103],{"href":1101,"rel":1102},"https:\u002F\u002Fgithub.com\u002Fnuxt\u002Ftest-utils\u002Fpull\u002F881",[149],"a PR to allow the runner to reuse an existing server",[13,1105,1106,1107,1112,1113,1116],{},"Simultaneously, I received feedback about ",[145,1108,1111],{"href":1109,"rel":1110},"https:\u002F\u002Fgithub.com\u002FBarbapapazes\u002Fplausible-tracker",[149],"my fork of the Plausible tracker",". Some bugs were reported, and new features were requested. The problem was the project had no tests, and I clearly remembered how painful it was on the tutoring platform. I also noticed I hadn't touched the project for a while, and manual testing wouldn't be enough to ensure the quality of the project in the long term. ",[138,1114,1115],{},"When you haven't touched a project for some time, you have to relearn everything. With reliable tests, you can be confident that the project works as expected, even after refactoring, bug fixes, and new features."," I decided to write tests before touching anything else. It took me three days, but now, I'm confident that the project works as expected. This is satisfying, and there is no more fear of touching the project.",[13,1118,1119],{},[1003,1120],{"alt":1121,"src":1122},"Passing tests of Plausible Tracker","\u002Fposts\u002Ftesting-is-more-larger-than-just-writing-some-tests\u002Fplausible-tracker-passing-tests.png",[13,1124,1125,1126],{},"Finally, around the same time, I discovered Laracasts. I learned PHP and encountered testing in Laravel. It was eye-opening. The testing is well explained, writing tests, even with a database, is easy, and it runs so fast. Writing tests with Pest is truly enjoyable. ",[138,1127,1128],{},"If you have never tried it, you should.",[1130,1131,1135,1139,1142,1145,1229,1235,1238],"callout",{"icon":1132,"text":1133,"to":1134},"i-ph-book-duotone","Try Laracats","https:\u002F\u002Flaracasts.com\u002Freferral\u002FBarbapapazes",[127,1136,1138],{"id":1137},"understanding-the-value-of-testing","Understanding the value of testing",[13,1140,1141],{},"It took me six years to grasp the value of testing and write meaningful tests. Is that long? I'm not sure. It demonstrates that learning is an iterative process, with failures and retries. With perseverance, you finally get there.",[13,1143,1144],{},"Throughout this journey, I asked myself many questions. Here are some answers I would have loved to find earlier.",[1146,1147,1148,1151,1157,1163,1169,1175,1181,1187,1193,1211,1217,1223],"ol",{},[1014,1149,1150],{},"Testing does not have to be difficult.",[1014,1152,1153,1154,95],{},"However, testing is more challenging than ",[34,1155,1156],{},"expect(1 + 1).toBe(2)",[1014,1158,1159,1160],{},"The difficulty of testing often relates to the application's architecture and the ability to separate features. ",[138,1161,1162],{},"The more modular the app is, the easier it is to test.",[1014,1164,1165,1166],{},"Before choosing a tool, consider the ability to test your app. ",[138,1167,1168],{},"If you can't test it, it's not worth it.",[1014,1170,1171,1172],{},"No tests are acceptable. ",[138,1173,1174],{},"It's a trade-off. Use it wisely.",[1014,1176,1177,1178],{},"Rule 5 does not invalidate rule 4 or rule 3. ",[138,1179,1180],{},"If you end up writing tests, you will thank yourself.",[1014,1182,1183,1184],{},"Aiming for 100% coverage is meaningless by itself. ",[138,1185,1186],{},"It's a trap that can lead to poor practices.",[1014,1188,1189,1190],{},"Both unit, integration, and end-to-end tests are valuable. ",[138,1191,1192],{},"Choose the one that best fits your needs.",[1014,1194,1195,1196,1199,1200,1203,1204,1207,1208],{},"Structure your test with the ",[34,1197,1198],{},"arrange",", ",[34,1201,1202],{},"act",", and ",[34,1205,1206],{},"assert"," method. ",[138,1209,1210],{},"It's a good method for organizing your test and starting to write them.",[1014,1212,1213,1214,1216],{},"Write the ",[34,1215,1206],{}," part first.",[1014,1218,1219,1220],{},"Think of a test as a description of a specification of the application. ",[138,1221,1222],{},"My app should display\u002Fdo this when this happens.",[1014,1224,1225,1226],{},"And more importantly, writing testable code before writing tests. ",[138,1227,1228],{},"This approach will make your code more readable, maintainable, and testable.",[13,1230,1231,1232],{},"Finally, do not attempt to test everything from day one in this journey. Start small, learn, write simple unit tests, understand how to modularize your code, and progress from there. ",[138,1233,1234],{},"It's a long journey, but it's worth it.",[13,1236,1237],{},"I'm still learning a lot, but I'm confident that I'm on the right path. See you in the next article!",[13,1239,1240],{},[138,1241,1242,1243,95],{},"Laracasts is the best resource I've found for learning testing. PHP is great, and learning general concepts is even better. ",[145,1244,1246],{"href":1134,"rel":1245},[149],"Try it now",[1248,1249,1250],"style",{},"html pre.shiki code .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}html pre.shiki code .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-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);}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 pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .s7zQu, html code.shiki .s7zQu{--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#89DDFF;--shiki-default-font-style:italic;--shiki-dark:#89DDFF;--shiki-dark-font-style:italic}",{"title":32,"searchDepth":73,"depth":73,"links":1252},[1253],{"id":129,"depth":73,"text":130},"a4721c3e-e9c6-4025-ae82-9c44edd68d75","2024-08-30","Testing is a journey, a lengthy expedition to uncover how the architecture and dependencies of an application can directly impact its quality and testability.","md",{},"\u002Fposts\u002Ftesting-is-more-larger-than-just-writing-some-tests","---\ncontentId: a4721c3e-e9c6-4025-ae82-9c44edd68d75\ntitle: Testing is More Larger Than Just Writing Some Tests\ndescription: Testing is a journey, a lengthy expedition to uncover how the architecture and dependencies of an application can directly impact its quality and testability.\ndate: 2024-08-30\n---\n\n> [!NOTE]\n> I am not a testing expert. I am merely sharing my thoughts on testing as a developer, in an article I would have appreciated when I began coding.\n\nI started coding six years ago. Since then, I've heard a lot about testing, but I have seen few real and practical examples.\n\nIn many articles I read, tests look like this:\n\n```js\nit('should return 2 when 1 + 1', () => {\n  expect(1 + 1).toBe(2)\n})\n```\n\nThis is **far from real-world scenarios** and does not help in understanding the true value of testing.\n\nI have to admit, when I don't comprehend something, I avoid using it. Nevertheless, since I first encountered the concept of testing, it has lingered in my mind, prompting me to gather knowledge about it.\n\n## A long journey\n\nI first heard about testing when I learned Vue 2 in 2019. In the tooling section, under the \"Single File Component\" page, I found a section dedicated to \"Testing.\"\n\nI think I read the beginning of the page but never went further. There were too many new concepts to grasp, too many tools to learn, and too many choices to make. _At that time, I understood that front-end testing is by far the most challenging part of testing._\n\nIn 2020, with some friends, we developed a tutoring platform. The API server was built with [Feathers.js 4](https:\u002F\u002Fcrow.docs.feathersjs.com\u002F). At that time, I was still grappling with testing. I remember looking for [the testing page in the Feathers.js documentation](https:\u002F\u002Fcrow.docs.feathersjs.com\u002Fguides\u002Fbasics\u002Ftesting.html#writing-tests) and even reading it. Despite not fully understanding it, I wrote many tests. It was a real struggle because the distinction between unit tests and integration tests was unclear to me, and running them in a CI was very difficult. _I was using MongoDB and Azure CI. Looking back, I think I wanted to endure pain._ I also remember trying to achieve 100% coverage. _I was so naive._\n\n```ts\nit('should patch', async () => {\n  expect.assertions(5)\n\n  const patchedResult: Department = await app\n    .service(serviceName)\n    .patch(result._id, anotherDepartment)\n\n  expect(patchedResult).toBeDefined()\n  expect(patchedResult).toHaveProperty('_id')\n  expect(patchedResult).toHaveProperty(\n    'name',\n    anotherDepartment.name.toLowerCase()\n  )\n  expect(patchedResult).toHaveProperty('createdAt')\n  expect(patchedResult).toHaveProperty('updatedAt')\n})\n\nit('should delete', async () => {\n  expect.assertions(5)\n\n  const deleteResult: Department = await app\n    .service(serviceName)\n    .remove(result._id)\n\n  expect(deleteResult).toBeDefined()\n  expect(deleteResult).toHaveProperty('_id')\n  expect(deleteResult).toHaveProperty('name', result.name.toLowerCase())\n  expect(deleteResult).toHaveProperty('createdAt')\n  expect(deleteResult).toHaveProperty('updatedAt')\n})\n```\n\nBut the more I added features to the platform, the more I realized the value of testing. It can **ensure that a new feature does not break an existing one** without the hassle of manually testing everything. This was particularly evident because Feathers.js has many intricate parts and services that can easily break when one part is modified.\n\n```ts\nexport default {\n  before: {\n    all: [],\n    find: [],\n    get: [],\n    create: [checkData(checkDataOptions)],\n    update: [disallow()],\n    patch: [checkData(checkDataOptions)],\n    remove: [],\n  },\n\n  after: {\n    all: [],\n    find: [iff(isProvider('external'), pickResult())],\n    get: [iff(isProvider('external'), pickResult())],\n    create: [],\n    update: [],\n    patch: [],\n    remove: [],\n  },\n}\n```\n\nThe complexity of the app grew exponentially, feature after feature. This was more related to the architecture of Feathers.js, but combined with the challenges of writing efficient tests, it was a nightmare to maintain. _Each change broke so many tests that I was unsure if the app was working or not._\n\nFrom that point on, I decided the ability to test the app was a requirement for choosing a new stack. _And this will be a long journey because in 2024, I'm still learning a lot but writing more tests than ever._\n\nAt the beginning of 2021, Strapi was gaining popularity, and I looked at it as a potential replacement for Feathers.js, still to build the tutoring platform. I was pleased to see that Strapi has a [dedicated page for testing](https:\u002F\u002Fdocs.strapi.io\u002Fdev-docs\u002Ftesting) in the documentation.\n\nSo, I jumped in and created a new project with Strapi to get started and see if testing was effective.\n\nSadly, I immediately [encountered a problem that never got resolved](https:\u002F\u002Fgithub.com\u002Fstrapi\u002Fstrapi\u002Fissues\u002F9376). Unable to run tests, I gave up and the tutoring platform was never migrated to Strapi, nor deployed to production. _I learned a lot from this side project. Often, the journey is more important than the destination._\n\n![Screenshot of this issue 9376](\u002Fposts\u002Ftesting-is-more-larger-than-just-writing-some-tests\u002Fstrapi-testing-issue.png)\n\nSo let's recap:\n\n- I only know JavaScript.\n- Feathers.js has a complex architecture and poor documentation on testing.\n- Strapi has good documentation on testing, but I was unable to run tests.\n- I need to find a new side project to learn testing.\n\nSome months later, I heard about AdonisJS. I don't remember how, but at that time, version 5 was in beta. It was a breath of fresh air because the documentation looked very good, and the framework was rich in features. Full of features, yes, but the testing part was not there yet. _The core team released Japa a year later. It's a pleasant testing framework for Node.js._\n\nRegardless, I learned so much about backend development and architecture with AdonisJS that testing was clearly not a priority. This was the first time I could split features and avoid internal dependencies. Much cleaner and easier to maintain than Feathers.js or NestJS. _Yes, I also tried NestJS, but this framework is a real joke to me._\n\nBy the end of August 2021, I embarked on a new side project called Insamee, a student ecosystem. That was the successor of the tutoring platform. The architecture is important to clarify. Initially, it was an API server with AdonisJS and four front-end apps using Nuxt. _Overkill and overly complicated, as I realize now._\n\n![Screenshot of Insamee](\u002Fposts\u002Ftesting-is-more-larger-than-just-writing-some-tests\u002Finsameeapp.png)\n\nBy the end of 2021, I rewrote the project from scratch using only Adonis and a single server. No more tests.\n\nI managed to pull myself away from school classes to focus on my project. _A real opportunity._ To validate my semester, I had to write a report and make a live presentation. During the presentation, I didn't talk about testing (there were none). However, the jury questioned me about it. I just said the runner was not ready yet, so I hadn't written any tests. They took a few minutes to explain that testing is crucial, and I clearly understood that a real and professional project must have tests, it's non-negotiable. In my mind, something clicked.\n\nSubsequently, from April to August 2022, I did a four-month internship at a consulting company in Paris. I was responsible for building, from scratch, an administration panel for a high-performance computing cluster project using Angular 14. This was a first for me. I had never used Angular before. It took me months to grasp the concept of `TestBed` and the dependency injection (DI) system. _I was so lost, but later, I discovered that dependency injection is important._ During that period, I learned concepts but had no real practice.\n\nIn 2024, I did my six-month internship at a Swiss cloud company. I was part of a team developing components for other projects. This is where I truly began to appreciate testing. Firstly, the coverage was at 90%. This means if the coverage drops below 90%, you have no other choice than to write tests to submit an MR. The project was eight months old, so there were plenty of tests to reference. I also wrote many end-to-end tests using Playwright.\n\nSimultaneously, I watched a live stream by Romain Lanz discussing \"writing testable code\" and explaining the DI in Adonis. With these explanations and the concrete examples I encountered during my internship, things started to come together and make sense.\n\nThis year, at Devoxx 2024, I tried to attend as many talks about TDD and DDD as possible. Hearing experts discuss real-world examples and how they architect their apps to make them testable and future-proof was truly enlightening.\n\n\u003CCalloutReadMore id=\"08852918-9829-4658-97b3-1aabede8e9fe\" \u002F>\n\nDespite all this, I still struggle to find genuine and practical examples of testing. It's so frustrating to know the theory but not be able to apply it.\n\nBut I believe that to learn, there is nothing more effective than taking action. So I took the framework I know best, Nuxt, and started experimenting with the [available testing tools](https:\u002F\u002Fgithub.com\u002Fnuxt\u002Ftest-utils). I used the end-to-end integration with Playwright, but it was not a pleasant experience. Tests took so long to run. _Strangely, the experience during my internship felt the opposite. I discovered that the Nuxt integration rebuilds the application before every test. I made [a PR to allow the runner to reuse an existing server](https:\u002F\u002Fgithub.com\u002Fnuxt\u002Ftest-utils\u002Fpull\u002F881)._\n\nSimultaneously, I received feedback about [my fork of the Plausible tracker](https:\u002F\u002Fgithub.com\u002FBarbapapazes\u002Fplausible-tracker). Some bugs were reported, and new features were requested. The problem was the project had no tests, and I clearly remembered how painful it was on the tutoring platform. I also noticed I hadn't touched the project for a while, and manual testing wouldn't be enough to ensure the quality of the project in the long term. _When you haven't touched a project for some time, you have to relearn everything. With reliable tests, you can be confident that the project works as expected, even after refactoring, bug fixes, and new features._ I decided to write tests before touching anything else. It took me three days, but now, I'm confident that the project works as expected. This is satisfying, and there is no more fear of touching the project.\n\n![Passing tests of Plausible Tracker](\u002Fposts\u002Ftesting-is-more-larger-than-just-writing-some-tests\u002Fplausible-tracker-passing-tests.png)\n\nFinally, around the same time, I discovered Laracasts. I learned PHP and encountered testing in Laravel. It was eye-opening. The testing is well explained, writing tests, even with a database, is easy, and it runs so fast. Writing tests with Pest is truly enjoyable. _If you have never tried it, you should._\n\n\u003CCallout icon=\"i-ph-book-duotone\" text=\"Try Laracats\" to=\"https:\u002F\u002Flaracasts.com\u002Freferral\u002FBarbapapazes\" \u002F>\n\n## Understanding the value of testing\n\nIt took me six years to grasp the value of testing and write meaningful tests. Is that long? I'm not sure. It demonstrates that learning is an iterative process, with failures and retries. With perseverance, you finally get there.\n\nThroughout this journey, I asked myself many questions. Here are some answers I would have loved to find earlier.\n\n1. Testing does not have to be difficult.\n2. However, testing is more challenging than `expect(1 + 1).toBe(2)`.\n3. The difficulty of testing often relates to the application's architecture and the ability to separate features. _The more modular the app is, the easier it is to test._\n4. Before choosing a tool, consider the ability to test your app. _If you can't test it, it's not worth it._\n5. No tests are acceptable. _It's a trade-off. Use it wisely._\n6. Rule 5 does not invalidate rule 4 or rule 3. _If you end up writing tests, you will thank yourself._\n7. Aiming for 100% coverage is meaningless by itself. _It's a trap that can lead to poor practices._\n8. Both unit, integration, and end-to-end tests are valuable. _Choose the one that best fits your needs._\n9. Structure your test with the `arrange`, `act`, and `assert` method. _It's a good method for organizing your test and starting to write them._\n10. Write the `assert` part first.\n11. Think of a test as a description of a specification of the application. _My app should display\u002Fdo this when this happens._\n12. And more importantly, writing testable code before writing tests. _This approach will make your code more readable, maintainable, and testable._\n\nFinally, do not attempt to test everything from day one in this journey. Start small, learn, write simple unit tests, understand how to modularize your code, and progress from there. _It's a long journey, but it's worth it._\n\nI'm still learning a lot, but I'm confident that I'm on the right path. See you in the next article!\n\n_Laracasts is the best resource I've found for learning testing. PHP is great, and learning general concepts is even better. [Try it now](https:\u002F\u002Flaracasts.com\u002Freferral\u002FBarbapapazes)._\n",null,{"title":5,"description":1256},{"loc":1259,"images":1264},[1265,1266,1267],{"loc":1006},{"loc":1049},{"loc":1122},"posts\u002Ftesting-is-more-larger-than-just-writing-some-tests","K6dOUjkk13_dbFi3PuV_3hEGcwAOJ2o-l67flRAXLYs",{"id":1271,"title":1272,"body":1273,"contentId":1083,"date":1714,"description":1715,"extension":1257,"meta":1716,"navigation":216,"path":1717,"rawbody":1718,"robots":1261,"schemaOrg":1261,"seo":1719,"sitemap":1720,"stem":1728,"__hash__":1729},"posts\u002Fposts\u002Fspeaking-at-devoxx-france-2024-insights-and-highlights.md","Speaking at Devoxx France 2024: Insights and Highlights",{"type":7,"value":1274,"toc":1707},[1275,1285,1294,1300],[13,1276,1277,1278,1281,1282,95],{},"Devoxx France is a huge conference that takes place in Paris. This year, more than ",[119,1279,1280],{},"4500 attendees"," were present with 70 exhibitors and ",[119,1283,1284],{},"319 speakers",[13,1286,1287,1288,1293],{},"It's so huge that it's impossible to attend all the talks. Sometimes, there are more than 10 talks at the same time, but thanks to the ",[145,1289,1292],{"href":1290,"rel":1291},"https:\u002F\u002Fwww.youtube.com\u002F@DevoxxFRvideos",[149],"replay on YouTube",", it's possible to watch them later.",[13,1295,1296],{},[1003,1297],{"alt":1298,"src":1299},"Photo of the exhibition hall and my speaker badge.","\u002Fposts\u002Fspeaking-at-devoxx-france-2024-insights-and-highlights\u002Ffirst-day.jpg",[1130,1301,1306,1310,1317,1326,1337,1340,1501,1513,1516,1523,1531,1538,1544,1549,1552,1556,1559,1566,1572,1579,1585,1591,1598,1604,1611,1614,1620,1624,1627,1647,1650,1653,1656,1659,1662,1665],{"w-full":32,"icon":1302,"text":1303,"to":1304,"target":1305},"i-simple-icons-youtube","View my talk about UnJS","https:\u002F\u002Fyoutu.be\u002F0BApl8r1VWc","_blank",[127,1307,1309],{"id":1308},"my-schedule","My schedule",[10,1311,1312],{},[13,1313,1314,1316],{},[16,1315,18],{},"\nIt's not a recommendation, it's just talks I was able to see.",[13,1318,1319,1320,1325],{},"Before going to Devoxx France, I had a look at the ",[145,1321,1324],{"href":1322,"rel":1323},"https:\u002F\u002Fmobile.devoxx.com\u002F",[149],"schedule"," and I made a list of talks that I wanted to attend. There are so many people that some talks were already full when I arrived at the room, and I discovered some talks that I preferred during the event (and choosing between all of these talks is not easy).",[13,1327,1328,1329,1332,1333,1336],{},"This year, my goal was to see a maximum of talks about ",[119,1330,1331],{},"DevOps"," and ",[119,1334,1335],{},"clean code",". I also wanted to be surprised by going to talk that I never go to just because I know the speaker or because the title is interesting (and I was not disappointed).",[13,1338,1339],{},"Finally, I was able to see (talk titles are in French):",[1011,1341,1342,1389,1442],{},[1014,1343,1344,1345],{},"Wednesday, 17 April\n",[1011,1346,1347,1353,1359,1365,1371,1377,1383],{},[1014,1348,1349,1352],{},[119,1350,1351],{},"IA en médecine : où en sommes-nous ?"," Presented by Jean-Emmanuel Bibault",[1014,1354,1355,1358],{},[119,1356,1357],{},"React Server Components : Effet de mode ou réel progrès ?"," Presented by Thomas Simonnet",[1014,1360,1361,1364],{},[119,1362,1363],{},"High-Speed DDD (revisited)."," Presented by Thomas Pierrain",[1014,1366,1367,1370],{},[119,1368,1369],{},"V, comme Vautledétour."," Presented by Emmanuel Remy",[1014,1372,1373,1376],{},[119,1374,1375],{},"Comment bien planter un side project ?"," Presented by David Laizé",[1014,1378,1379,1382],{},[119,1380,1381],{},"Toutes et tous Mercenaires de DevOps!"," Presented by Arnaud Héritier, Henri Gomez, Pierre-Antoine Grégoire, Dimitri Baeli, and Gildas Cuisinier",[1014,1384,1385,1388],{},[119,1386,1387],{},"La recherche sous stéroïdes - une histoire de sémantique."," Presented by Mathilde Rigabert and Martin Labenne",[1014,1390,1391,1392],{},"Thursday, 18 April\n",[1011,1393,1394,1400,1406,1412,1418,1424,1430,1436],{},[1014,1395,1396,1399],{},[119,1397,1398],{},"Programming's Greatest Mistakes."," Presented by Mark Rendle",[1014,1401,1402,1405],{},[119,1403,1404],{},"Un monde shooté aux métaux."," Presented by Guillaume Pitron and Agnes Crepet",[1014,1407,1408,1411],{},[119,1409,1410],{},"GatewayAPI, 10 ans de maturation pour une nouvelle API Kubernetes."," Presented by Kevin Davin",[1014,1413,1414,1417],{},[119,1415,1416],{},"Comment K8S a changé le monde de l'Ops."," Presented by Aurélien Moreau and Loïc Ortola",[1014,1419,1420,1423],{},[119,1421,1422],{},"Architecture Hexagonale: Comment venir à bout du code spaghetti ?"," Presented by Kévin LLOPIS",[1014,1425,1426,1429],{},[119,1427,1428],{},"Java rencontre l'IA : Comment intégrer les LLMs dans vos applications avec LangChain4j."," Presented by Lize Raes",[1014,1431,1432,1435],{},[119,1433,1434],{},"Les nouveautés de Java 21."," Presented by Jean-Michel Doudoux",[1014,1437,1438,1441],{},[119,1439,1440],{},"Debugguez votre salaire ! Mes stratégies gagnantes pour réussir sa négociation salariale."," Presented by Shirley Almosni-Chiche",[1014,1443,1444,1445],{},"Friday, 19 April\n",[1011,1446,1447,1453,1459,1465,1471,1477,1483,1489,1495],{},[1014,1448,1449,1452],{},[119,1450,1451],{},"Comment modéliser l'état du monde en 2100 ?"," Le Rapport Meadows. Presented by Anatole Chouard",[1014,1454,1455,1458],{},[119,1456,1457],{},"Cybersécurité et cyberdéfense : un sujet géopolitique."," Presented by Guillaume Poupard",[1014,1460,1461,1464],{},[119,1462,1463],{},"Model Mitosis : ne plus se tromper entre les microservices et le monolithe."," Presented by Julien Topçu and Josian Chevalier",[1014,1466,1467,1470],{},[119,1468,1469],{},"L'architecture micro frontend : comment transformer son site web en puzzle géant collaboratif."," Presented by Maxime Ribera and Ludovic Lagatie",[1014,1472,1473,1476],{},[119,1474,1475],{},"Unifié et Universel, le JavaScript avec UnJS."," Presented by Estéban Soubiran (it's me)",[1014,1478,1479,1482],{},[119,1480,1481],{},"Au-delà des heures : La semaine de 4 jours comme levier d'égalité."," Presented by Albane Veyron",[1014,1484,1485,1488],{},[119,1486,1487],{},"Créer sa propre VM avec compilation JIT pour les nuls."," Presented by Olivier Poncet",[1014,1490,1491,1494],{},[119,1492,1493],{},"L'Architecture Hexagonale par la pratique, le live coding qui rendra vos applications plus pérennes."," Presented by Julien Topçu",[1014,1496,1497,1500],{},[119,1498,1499],{},"Accessibilité du web : du design au code comment tendre vers davantage d'inclusion ?"," Presented by Marjorie Aubert",[10,1502,1503],{},[13,1504,1505,1507,1508,95],{},[16,1506,18],{},"\nThis is only talks I was able to see (a small part of all available talks). To view the full schedule, go to the ",[145,1509,1512],{"href":1510,"rel":1511},"https:\u002F\u002Fmobile.devoxx.com\u002Fevents\u002Fdevoxxfr2024\u002Fschedule",[149],"Devoxx France 2024 schedule",[13,1514,1515],{},"Yes, there is some Java (I'm a web dev doing JavaScript) because I love to discover other languages and how they solve problems, the way they think and the tools they use. At the same time, the more time I spend in the web world, the more I think I need to learn Java because it's very convenient for big projects with its strong typing and its powerful dependency injection.",[13,1517,1518,1519,1522],{},"This year, there is ",[119,1520,1521],{},"a trend about LLM, AI, RAG",", and how to integrate them into your business. Since AI is available for everyone for cheap, there are more and more usages (and real usage) of them. It's not only for big companies but also for small companies and even for individuals. So many possibilities, it's very exciting and many talks show that.",[13,1524,1525,1526,1530],{},"At the end of the day, all of these talks are good and you will definitely learn something by watching them on the ",[145,1527,1529],{"href":1290,"rel":1528},[149],"Devoxx France YouTube channel",". Go ahead!",[13,1532,1533,1534,1537],{},"One of the interesting parts of Devoxx France is the ",[119,1535,1536],{},"exhibitors",". There are many stands where you can meet partners, discover new tools, and have fun. This year, I discovered I didn't take a lot of time to visit them, but I discovered some new tools and projects. One of them is to help teams to agree on best practices and to follow them or another one which builds a data center using GCP stack but without Google in order to be GDPR compliant and to build a 'trusted cloud'.",[13,1539,1540],{},[1003,1541],{"alt":1542,"src":1543},"Photo of the JavaScript logo built with LEGO on one of the partner stands.","\u002Fposts\u002Fspeaking-at-devoxx-france-2024-insights-and-highlights\u002Flego.jpg",[1545,1546,1548],"h3",{"id":1547},"speakers-dinner","Speakers dinner",[13,1550,1551],{},"Wednesday evening, I had the chance, with every other speaker, to attend the speakers' dinner. It was a private moment to meet the other speakers, and to chill before the rest of the event. I have to admit that this is not really my cup of tea to talk to unknown people, but the food was great so it was a nice moment.",[1545,1553,1555],{"id":1554},"my-preferred-talks","My preferred talks",[13,1557,1558],{},"I really want to highlight some talks that I really enjoyed and that I recommend to everyone (some of them are truly mind-blowing).",[13,1560,1561,1562,1565],{},"The first one is the talk about ",[119,1563,1564],{},"RAG"," (Retrieval-Augmented Generation) where I learned a lot about this concept, how to use it and frameworks that make it easy to use. I really think this technology is the future, but it will be the subject for another article (I need to learn more about it and to start using it).",[13,1567,1568],{},[1003,1569],{"alt":1570,"src":1571},"Photo of the talk about RAG.","\u002Fposts\u002Fspeaking-at-devoxx-france-2024-insights-and-highlights\u002Frag.jpg",[13,1573,1574,1575,1578],{},"The second one is the talk about ",[119,1576,1577],{},"micro front-end",". On paper, the subject is interesting but too often, talks about micro front-end are very theoretical, not very practical, and usage, with benefits, is not clear. But, this talk was at the opposite of that. They explained, in detail, how they implemented and used it and more importantly, why they do it. At the end, the live coding was on the live website (yes, on leroymerlin.fr) and it was very impressive.",[13,1580,1581],{},[1003,1582],{"alt":1583,"src":1584},"Photo of Leroy Merlin's talk on micro front-ends.","\u002Fposts\u002Fspeaking-at-devoxx-france-2024-insights-and-highlights\u002Fmicro-front-end.jpg",[13,1586,1587,1588,1590],{},"The third one is the talk that retraced the history of ",[119,1589,1331],{}," from 25 years ago. It was very interesting to see how successive technologies are linked to each other and to understand that the actual state of DevOps is the work of years, steps by steps. It's not a revolution but a progressive evolution, from VMs to containers, orchestrators, and IaC.",[13,1592,1593,1594,1597],{},"By hazard, but because I like the content of the person on X, I went to a talk about ",[119,1595,1596],{},"JIT",". I knew about this term and the objective but not how it was implemented. In 45 minutes, the speaker coded a simple but functional JIT compiler in C++. It almost looks easy and I think it's important to know how these pieces of tech, that we use every day, work.",[13,1599,1600],{},[1003,1601],{"alt":1602,"src":1603},"Photo of the talk about JIT.","\u002Fposts\u002Fspeaking-at-devoxx-france-2024-insights-and-highlights\u002Fjit.jpg",[13,1605,1606,1607,1610],{},"The last one was about ",[119,1608,1609],{},"hexagonal architecture",". I already know the concept, but I never implemented it. The speaker did a live coding session where he implemented a simple application with hexagonal architecture. It was very interesting to see how the code is organized and how it's easy to test and to maintain. The fact that he implemented the domain (business logic) first with tests and then connected it to the infrastructure (the framework) was very nice to discover. I will definitely deep dive into this concept and write articles about it. When you go to a talk like this, it's like going to the theater and seeing a movie, I love this experience.",[13,1612,1613],{},"Overall, you should really watch these talks. They are very interesting and you will learn a lot.",[13,1615,1616],{},[1003,1617],{"alt":1618,"src":1619},"Photo of the large Devoxx amphitheater.","\u002Fposts\u002Fspeaking-at-devoxx-france-2024-insights-and-highlights\u002Famphi.jpg",[127,1621,1623],{"id":1622},"my-talk","My talk",[13,1625,1626],{},"This year, I submitted 3 talks to the CFP (Call For Paper):",[1011,1628,1629,1635,1641],{},[1014,1630,1631,1634],{},[119,1632,1633],{},"Construire un méta framework front-end pour l'edge"," (in English: Building a meta front-end framework for the edge)",[1014,1636,1637,1640],{},[119,1638,1639],{},"Unifié et Universel, le JavaScript avec UnJS"," (in English: Unified and Universal, JavaScript with UnJS)",[1014,1642,1643,1646],{},[119,1644,1645],{},"Atteindre l'edge avec Nuxt"," (in English: Reaching the edge with Nuxt)",[13,1648,1649],{},"And one of them was accepted. Yippee! It's important to note that Devoxx France is, originally, a Java conference, and I'm pretty sure that the edge is unknown for most of the attendees, and this could explain why these talks were not accepted.",[13,1651,1652],{},"But one was accepted, and I have to prepare it!",[13,1654,1655],{},"I chose to talk about UnJS because I love the philosophy behind it, and I think it's a very good tool for a JavaScript developer. Talking for 15 minutes about UnJS is also a challenge because that's not a lot of time, and the quantity and diversity of packages that UnJS provides is huge.",[13,1657,1658],{},"The first step is to choose packages I wanted to present. Then, I have to select which part of the selected packages I want to present, the one that could be interesting for most of the attendees. It's way more difficult than having a 1-hour talk where I could go deep into the subject, but it's a good exercise to be concise.",[13,1660,1661],{},"Finally, I ended up talking about the history and philosophy of UnJS and presenting useful packages for most developers like unbuild, nitro, or magic-regexp and going straight to the point for each of them. My goal was to give a good overview of UnJS and to make people want to try it.",[13,1663,1664],{},"Fortunately, I was able to train my talk at StrasbourgJS. This helps me to refine some parts and to be more confident.",[1081,1666,1668,1674],{"id":1667},"ba562d1f-534c-4cef-9004-2fefc09829a6",[13,1669,1670,1671,95],{},"My talk was on Friday at 12:35, and until 12:20, I was confident. I repeated my talk many times, and I know UnJS. But when I came into the room and stood behind the desk, the stress came. Then, I started talking, and everything was fine. I'm proud of my talk. I really hope you will enjoy the replay on the ",[145,1672,1529],{"href":1290,"rel":1673},[149],[1130,1675,1676,1681,1684],{"w-full":32,"icon":1302,"text":1303,"to":1304,"target":1305},[13,1677,1678],{},[138,1679,1680],{},"Slides are coming soon.",[13,1682,1683],{},"A good thing done, and it's so good to share knowledge with others and talk with them. I feel that I still have a long way to go before making the perfect presentation, so I will continue to submit talks to conferences and to meetups.",[1685,1686,1687,1691,1694,1701,1704],"callout-available-for-giving-a-talk",{},[127,1688,1690],{"id":1689},"finally","Finally",[13,1692,1693],{},"Devoxx France is a unique event. There are so many talks, so much diversity in the subjects, and so many people that you will definitely learn something. This year was the biggest Devoxx France ever with more than 4000 attendees.",[13,1695,1696,1697,1700],{},"And even if the event is physically finished, it continues online with the ",[145,1698,1292],{"href":1290,"rel":1699},[149],". So, if you can't attend, you can still watch the talks!",[13,1702,1703],{},"Thanks to the organizers and the red coat team for this amazing event. I hope to see you next year (I'm already working on many talks for the next edition)!",[13,1705,1706],{},"Until then, take care and keep learning!",{"title":32,"searchDepth":73,"depth":73,"links":1708},[1709,1713],{"id":1308,"depth":73,"text":1309,"children":1710},[1711,1712],{"id":1547,"depth":109,"text":1548},{"id":1554,"depth":109,"text":1555},{"id":1622,"depth":73,"text":1623},"2024-04-22","Uncover key insights and talks from Devoxx France 2024, focusing on AI, LLM, RAG, and more, plus a my talk on UnJS!",{},"\u002Fposts\u002Fspeaking-at-devoxx-france-2024-insights-and-highlights","---\ncontentId: 08852918-9829-4658-97b3-1aabede8e9fe\ntitle: \"Speaking at Devoxx France 2024: Insights and Highlights\"\ndescription: Uncover key insights and talks from Devoxx France 2024, focusing on AI, LLM, RAG, and more, plus a my talk on UnJS!\ndate: 2024-04-22\n---\n\nDevoxx France is a huge conference that takes place in Paris. This year, more than **4500 attendees** were present with 70 exhibitors and **319 speakers**.\n\nIt's so huge that it's impossible to attend all the talks. Sometimes, there are more than 10 talks at the same time, but thanks to the [replay on YouTube](https:\u002F\u002Fwww.youtube.com\u002F@DevoxxFRvideos), it's possible to watch them later.\n\n![Photo of the exhibition hall and my speaker badge.](\u002Fposts\u002Fspeaking-at-devoxx-france-2024-insights-and-highlights\u002Ffirst-day.jpg)\n\n\u003CCallout w-full icon=\"i-simple-icons-youtube\" text=\"View my talk about UnJS\" to=\"https:\u002F\u002Fyoutu.be\u002F0BApl8r1VWc\" target=\"_blank\" \u002F>\n\n## My schedule\n\n> [!NOTE]\n> It's not a recommendation, it's just talks I was able to see.\n\nBefore going to Devoxx France, I had a look at the [schedule](https:\u002F\u002Fmobile.devoxx.com\u002F) and I made a list of talks that I wanted to attend. There are so many people that some talks were already full when I arrived at the room, and I discovered some talks that I preferred during the event (and choosing between all of these talks is not easy).\n\nThis year, my goal was to see a maximum of talks about **DevOps** and **clean code**. I also wanted to be surprised by going to talk that I never go to just because I know the speaker or because the title is interesting (and I was not disappointed).\n\nFinally, I was able to see (talk titles are in French):\n\n- Wednesday, 17 April\n  - **IA en médecine : où en sommes-nous ?** Presented by Jean-Emmanuel Bibault\n  - **React Server Components : Effet de mode ou réel progrès ?** Presented by Thomas Simonnet\n  - **High-Speed DDD (revisited).** Presented by Thomas Pierrain\n  - **V, comme Vautledétour.** Presented by Emmanuel Remy\n  - **Comment bien planter un side project ?** Presented by David Laizé\n  - **Toutes et tous Mercenaires de DevOps!** Presented by Arnaud Héritier, Henri Gomez, Pierre-Antoine Grégoire, Dimitri Baeli, and Gildas Cuisinier\n  - **La recherche sous stéroïdes - une histoire de sémantique.** Presented by Mathilde Rigabert and Martin Labenne\n- Thursday, 18 April\n  - **Programming's Greatest Mistakes.** Presented by Mark Rendle\n  - **Un monde shooté aux métaux.** Presented by Guillaume Pitron and Agnes Crepet\n  - **GatewayAPI, 10 ans de maturation pour une nouvelle API Kubernetes.** Presented by Kevin Davin\n  - **Comment K8S a changé le monde de l'Ops.** Presented by Aurélien Moreau and Loïc Ortola\n  - **Architecture Hexagonale: Comment venir à bout du code spaghetti ?** Presented by Kévin LLOPIS\n  - **Java rencontre l'IA : Comment intégrer les LLMs dans vos applications avec LangChain4j.** Presented by Lize Raes\n  - **Les nouveautés de Java 21.** Presented by Jean-Michel Doudoux\n  - **Debugguez votre salaire ! Mes stratégies gagnantes pour réussir sa négociation salariale.** Presented by Shirley Almosni-Chiche\n- Friday, 19 April\n  - **Comment modéliser l'état du monde en 2100 ?** Le Rapport Meadows. Presented by Anatole Chouard\n  - **Cybersécurité et cyberdéfense : un sujet géopolitique.** Presented by Guillaume Poupard\n  - **Model Mitosis : ne plus se tromper entre les microservices et le monolithe.** Presented by Julien Topçu and Josian Chevalier\n  - **L'architecture micro frontend : comment transformer son site web en puzzle géant collaboratif.** Presented by Maxime Ribera and Ludovic Lagatie\n  - **Unifié et Universel, le JavaScript avec UnJS.** Presented by Estéban Soubiran (it's me)\n  - **Au-delà des heures : La semaine de 4 jours comme levier d'égalité.** Presented by Albane Veyron\n  - **Créer sa propre VM avec compilation JIT pour les nuls.** Presented by Olivier Poncet\n  - **L'Architecture Hexagonale par la pratique, le live coding qui rendra vos applications plus pérennes.** Presented by Julien Topçu\n  - **Accessibilité du web : du design au code comment tendre vers davantage d'inclusion ?** Presented by Marjorie Aubert\n\n> [!NOTE]\n> This is only talks I was able to see (a small part of all available talks). To view the full schedule, go to the [Devoxx France 2024 schedule](https:\u002F\u002Fmobile.devoxx.com\u002Fevents\u002Fdevoxxfr2024\u002Fschedule).\n\nYes, there is some Java (I'm a web dev doing JavaScript) because I love to discover other languages and how they solve problems, the way they think and the tools they use. At the same time, the more time I spend in the web world, the more I think I need to learn Java because it's very convenient for big projects with its strong typing and its powerful dependency injection.\n\nThis year, there is **a trend about LLM, AI, RAG**, and how to integrate them into your business. Since AI is available for everyone for cheap, there are more and more usages (and real usage) of them. It's not only for big companies but also for small companies and even for individuals. So many possibilities, it's very exciting and many talks show that.\n\nAt the end of the day, all of these talks are good and you will definitely learn something by watching them on the [Devoxx France YouTube channel](https:\u002F\u002Fwww.youtube.com\u002F@DevoxxFRvideos). Go ahead!\n\nOne of the interesting parts of Devoxx France is the **exhibitors**. There are many stands where you can meet partners, discover new tools, and have fun. This year, I discovered I didn't take a lot of time to visit them, but I discovered some new tools and projects. One of them is to help teams to agree on best practices and to follow them or another one which builds a data center using GCP stack but without Google in order to be GDPR compliant and to build a 'trusted cloud'.\n\n![Photo of the JavaScript logo built with LEGO on one of the partner stands.](\u002Fposts\u002Fspeaking-at-devoxx-france-2024-insights-and-highlights\u002Flego.jpg)\n\n### Speakers dinner\n\nWednesday evening, I had the chance, with every other speaker, to attend the speakers' dinner. It was a private moment to meet the other speakers, and to chill before the rest of the event. I have to admit that this is not really my cup of tea to talk to unknown people, but the food was great so it was a nice moment.\n\n### My preferred talks\n\nI really want to highlight some talks that I really enjoyed and that I recommend to everyone (some of them are truly mind-blowing).\n\nThe first one is the talk about **RAG** (Retrieval-Augmented Generation) where I learned a lot about this concept, how to use it and frameworks that make it easy to use. I really think this technology is the future, but it will be the subject for another article (I need to learn more about it and to start using it).\n\n![Photo of the talk about RAG.](\u002Fposts\u002Fspeaking-at-devoxx-france-2024-insights-and-highlights\u002Frag.jpg)\n\nThe second one is the talk about **micro front-end**. On paper, the subject is interesting but too often, talks about micro front-end are very theoretical, not very practical, and usage, with benefits, is not clear. But, this talk was at the opposite of that. They explained, in detail, how they implemented and used it and more importantly, why they do it. At the end, the live coding was on the live website (yes, on leroymerlin.fr) and it was very impressive.\n\n![Photo of Leroy Merlin's talk on micro front-ends.](\u002Fposts\u002Fspeaking-at-devoxx-france-2024-insights-and-highlights\u002Fmicro-front-end.jpg)\n\nThe third one is the talk that retraced the history of **DevOps** from 25 years ago. It was very interesting to see how successive technologies are linked to each other and to understand that the actual state of DevOps is the work of years, steps by steps. It's not a revolution but a progressive evolution, from VMs to containers, orchestrators, and IaC.\n\nBy hazard, but because I like the content of the person on X, I went to a talk about **JIT**. I knew about this term and the objective but not how it was implemented. In 45 minutes, the speaker coded a simple but functional JIT compiler in C++. It almost looks easy and I think it's important to know how these pieces of tech, that we use every day, work.\n\n![Photo of the talk about JIT.](\u002Fposts\u002Fspeaking-at-devoxx-france-2024-insights-and-highlights\u002Fjit.jpg)\n\nThe last one was about **hexagonal architecture**. I already know the concept, but I never implemented it. The speaker did a live coding session where he implemented a simple application with hexagonal architecture. It was very interesting to see how the code is organized and how it's easy to test and to maintain. The fact that he implemented the domain (business logic) first with tests and then connected it to the infrastructure (the framework) was very nice to discover. I will definitely deep dive into this concept and write articles about it. When you go to a talk like this, it's like going to the theater and seeing a movie, I love this experience.\n\nOverall, you should really watch these talks. They are very interesting and you will learn a lot.\n\n![Photo of the large Devoxx amphitheater.](\u002Fposts\u002Fspeaking-at-devoxx-france-2024-insights-and-highlights\u002Famphi.jpg)\n\n## My talk\n\nThis year, I submitted 3 talks to the CFP (Call For Paper):\n\n- **Construire un méta framework front-end pour l'edge** (in English: Building a meta front-end framework for the edge)\n- **Unifié et Universel, le JavaScript avec UnJS** (in English: Unified and Universal, JavaScript with UnJS)\n- **Atteindre l'edge avec Nuxt** (in English: Reaching the edge with Nuxt)\n\nAnd one of them was accepted. Yippee! It's important to note that Devoxx France is, originally, a Java conference, and I'm pretty sure that the edge is unknown for most of the attendees, and this could explain why these talks were not accepted.\n\nBut one was accepted, and I have to prepare it!\n\nI chose to talk about UnJS because I love the philosophy behind it, and I think it's a very good tool for a JavaScript developer. Talking for 15 minutes about UnJS is also a challenge because that's not a lot of time, and the quantity and diversity of packages that UnJS provides is huge.\n\nThe first step is to choose packages I wanted to present. Then, I have to select which part of the selected packages I want to present, the one that could be interesting for most of the attendees. It's way more difficult than having a 1-hour talk where I could go deep into the subject, but it's a good exercise to be concise.\n\nFinally, I ended up talking about the history and philosophy of UnJS and presenting useful packages for most developers like unbuild, nitro, or magic-regexp and going straight to the point for each of them. My goal was to give a good overview of UnJS and to make people want to try it.\n\nFortunately, I was able to train my talk at StrasbourgJS. This helps me to refine some parts and to be more confident.\n\n\u003CCalloutReadMore id=\"ba562d1f-534c-4cef-9004-2fefc09829a6\" \u002F>\n\nMy talk was on Friday at 12:35, and until 12:20, I was confident. I repeated my talk many times, and I know UnJS. But when I came into the room and stood behind the desk, the stress came. Then, I started talking, and everything was fine. I'm proud of my talk. I really hope you will enjoy the replay on the [Devoxx France YouTube channel](https:\u002F\u002Fwww.youtube.com\u002F@DevoxxFRvideos).\n\n\u003CCallout w-full icon=\"i-simple-icons-youtube\" text=\"View my talk about UnJS\" to=\"https:\u002F\u002Fyoutu.be\u002F0BApl8r1VWc\" target=\"_blank\" \u002F>\n\n_Slides are coming soon._\n\nA good thing done, and it's so good to share knowledge with others and talk with them. I feel that I still have a long way to go before making the perfect presentation, so I will continue to submit talks to conferences and to meetups.\n\n\u003CCalloutAvailableForGivingATalk \u002F>\n\n## Finally\n\nDevoxx France is a unique event. There are so many talks, so much diversity in the subjects, and so many people that you will definitely learn something. This year was the biggest Devoxx France ever with more than 4000 attendees.\n\nAnd even if the event is physically finished, it continues online with the [replay on YouTube](https:\u002F\u002Fwww.youtube.com\u002F@DevoxxFRvideos). So, if you can't attend, you can still watch the talks!\n\nThanks to the organizers and the red coat team for this amazing event. I hope to see you next year (I'm already working on many talks for the next edition)!\n\nUntil then, take care and keep learning!\n",{"title":1272,"description":1715},{"loc":1717,"images":1721},[1722,1723,1724,1725,1726,1727],{"loc":1299},{"loc":1543},{"loc":1571},{"loc":1584},{"loc":1603},{"loc":1619},"posts\u002Fspeaking-at-devoxx-france-2024-insights-and-highlights","u5n4K5q-Zdb1cmC931CHIiMev75GcB5jAH4MvhUT0sw",1790086901654]