Add cars-assemble concept exercise#1035
Conversation
Unlocks if-control-structures and comparison-operators after booleans and numbers, ported from csharp/cars-assemble. Co-authored-by: Cursor <[email protected]>
|
Thanks a lot for your work! New to the PHP track and head first into concept exercise writing. Do you have experience with Exercism approach to concepts, concept exercises and the didact concept behind all this code and files? I tried to get my head around this PR, but I run out of time for today. I hope to find time for the review this weekend. |
|
@mk-mxp Thanks! Take your time with the review, no rush. I’m used to seeing PHP and how it works, because I work with it daily in WordPress. Writing it from scratch has always been harder for me. I’ve been more of an “understand, copy and paste” person. That’s why I’m going through this track myself. Along the way, I thought it could be a good idea to help improve it while I review and reinforce concepts. What’s new for me is Exercism’s approach to concepts, concept exercises, and the docs/meta structure around them. How I built this PR: I used the C# cars-assemble as a close reference (especially the story/instructions), rewrote the PHP docs, and used another existing PHP track exercise as a reference for PHPUnit syntax, since I hadn’t written those tests by hand before. The idea was almost a 1:1 port from the C# track, but I think it may feel too complex for the actual level of the PHP track. For example, the exemplar uses self::, which isn’t taught yet on the PHP track. Would you rather I keep working on this PR and simplify it, or close it for now so I can open a small issue first and rewrite the exercise in a simpler way? My intention is to help improve the PHP track while learning a bit myself. I don’t want to create noise or extra work for you, so I’ll follow your suggestion. Thanks again! |
Just to clarify one point from my previous comment: what’s new for me is not the syllabus idea itself. I get that Exercism teaches roughly one concept at a time, like a skill tree that unlocks as you go. What’s newer for me is the practical side of writing the docs/meta files around a concept exercise. As I said, this was almost a 1:1 port from C#. I could clean it up a bit so the idea stays the same, but making the code a little more beginner-friendly. The class constant / self:: in the exemplar is the part that bothers me most. Happy to wait for your comments and suggestions. I’m here to try and help if I can, not to make things harder. Please feel completely free to tell me if it makes sense for me to keep contributing, or if right now it would be more of a burden than a help. I’d rather ask than get in the way. |
|
@resu-xuniL This might be interesting for you, too! Let's start with common details: There is a lot of documentation what the files are and what they must / should contain. We have a tool Concepts and concept exercises are much more track specific than practice exercises. So while there is a problem specification repo for practice exercises, concept exercises must be hand picked and adjusted to the track heavily. You picked one from C# that has a good fit for PHP. You may also look at JavaScript or Python, which also have great exercises we may use. Our list of concepts is much bigger than the list of concept exercises. Ideally each concept is accompanied by one concept exercise, tailored to make students use and understand this concept. The design.md of the exercise should clearly state, what is taught. But there also may be multiple concepts / concept exercises around a single topic - e.g. variable-length arguments are an addition to user-defined functions - it depends on what we think is suitable for a learning unit. The other way around (one exercise shared by multiple concepts) has shown to be un-helpful. Students get irritated by getting told, that they have learned a concept they didn't even look at. We want to avoid that, but especially for the first few exercises this is really hard to do. So Exercism says, we should do "hand-waving" instead - use languge constructs not yet introduced, but not explain them in detail. We think hard to avoid this - idiomatic, production-like code is not the goal. First of all it needs to be understandable for people without PHP knowledge. In addition, the concepts have 2 parts on them. One part is We also have a Weaving the exercise into the sylabus tree: Avoid too many prerequisites (1-2, 3 at max). Assume all dependencies of the chosen prerequisites to be fulfilled, don't repeat them. Ask first, what logic prerequisites a concept has, then think about how the concept exercise constrained to these prerequisites should look like. In this example, as you already pointed out, the class constant is a construct we shouldn't use. Also look at the I'm out of time again, I'll come back to this tomorrow. |
|
@pablo-miralles @resu-xuniL I'll go more specifically into this concept / concept exercise now. @pablo-miralles Please keep working on this PR and modify it. I think it is a good fit and not too far away from being merged 😄 As said before, sharpening the focus could help with more intensely teaching If possible, try to stay away from type casting / type conversions, too. When giving code examples, in concept or exercise documents, we have to use PHP specific syntax. This a bit of a challenge for polyglot programmers, but it hits students hard when they copy code into their exercise and it doesn't work. Please look through the documents and fix places like Looking forward to the next iteration, you are welcome to help! |
8c14320 to
1e6928c
Compare
|
@pablo-miralles To avoid that I read code you still work on, please drop me a note when you are done with the iteration. |
Focus the exercise on one concept, simplify the exemplar, and align docs with maintainer feedback. Co-authored-by: Cursor <[email protected]>
|
@mk-mxp Thanks again for taking the time to explain how Exercism concepts and concept exercises work. That context helped a lot, especially as this is my first contribution here :) Also, sorry about the accidental update on this PR earlier. I pushed a revision by mistake while still iterating locally, then force-pushed back to the previous commit so the PR would show the original version again. I know that still leaves a noisy history, and I’m sorry for the extra noise. I’ve now revised the exercise locally following your guidance (narrower focus on comparison-operators, simpler exemplar, no casting / self::, updated concept docs, and PHP-valid examples). I’ve pushed that next iteration shortly for review. Thanks again for the clear feedback and for welcoming the help! |
Summary
cars-assembleconcept exercise, ported fromcsharp/cars-assemble.comparison-operatorsandif-control-structuresafterbooleansand the number concepts frompizza-pi.Test plan
bin/configlet generate/fmt/lintPHPUNIT_BIN=phpunit bin/test.sh cars-assemble(18 tests passing)Made with Cursor