Ask HN: Old CS lecturer looking for advice from current and recent students
I am 61, with an academic background in computer science, and many years in industry, mostly startups. I taught many years ago, and have resumed teaching, a database course: data modeling, relational algebra, SQL, application programming and architecture (e.g. 2-tier vs. 3-tier, web & mobile), database internals.
Student evaluations were pretty good for the most part, but quite a few students found the presentation a bit dry: I prepared every lecture as HTML ahead of time, made it available online, and presented it in class. A couple of times, I would do interactive things, e.g. tuning queries using EXPLAIN and playing with indexes. That proved pretty popular, but of course, it's difficult to capture this material, (I recorded a log of the session, but extemperaneous discussion was not captured).
Looking for advice on how to balance prepared material and more spontaneous things. Also, any other advice on how to make material of this sort (theory + practice) easier to absorb.
182 comments
[ 4.8 ms ] story [ 243 ms ] threadI’m not sure about others but i would have found such an approach very involving. Instead i was taught chapter by chapter of preset text book syllabus followed by standardized exams.
I hope this helps:
Now my question is how to combine prepared notes (the HTML lectures), live sessions, and perhaps other techniques in class.
Those are great cases to review, and then to work backwards to the root cause and to discuss possible fixes. That's both CS and practical knowledge in a way that it sticks, the best school I've found to be other people's mistakes.
Those allow you to run code directly from browser - and if you include basic instrumentation (timing, step counters, item/memory use counters, ...) then it becomes really easy to show how a simple change makes things either better or worse.
To keep things language agnostic, you can cherrypick a different language for different purposes. That way you get to ensure that the lessons are not tied a particular language and the concepts have to apply universally.[1] For an interesting twist, maybe pick some historical examples too, to show how things have evolved in languages over time.
Then, when the basic concept of the lesson is [hopefully] understood, expand to a short case study to show why the dry theory matters in practice. For example, there's an old DoS attack against DNS servers, where a 56k modem could take down a root server due to unbounded O(n^2) worst-case complexity in the hash table implementations.[0]
0: https://www.usenix.org/legacy/publications/library/proceedin...
1: For extra points, you can pick examples where a particular language has chosen an implementation with amusing problems.
I'm sure you can sprinkle some of those into the classes to give a little light relief if the students are really finding things too dry. You don't have to go as far as recreating TheDailyWTF. Perhaps use some to provide worked examples of designing yourself into blind alleys and how to get out again, or just to provide awareness of a few real world issues that might come up with whatever topic is the day's lecture.
When I hire I prefer to Herve someone with some practical knowledge rather than the capacity to build a compiler.
So having the "let's build something" experience is useful in the real world afterwards.
It is, but it’s not the job of academia to teach it. You have side-projects, internships, and your whole life to learn practice.
If I have a choice between a hiring a junior developer who has a computer science degree and only knows theory and a junior whose only experience is a boot camp where they learned practical skills. I’m going to hire the boot camp graduate first. Yes I have a “computer science” degree in the early 90s from an unknown state school, didn’t learn anything and the only reason I was employable was due to my prior knowledge from years programming in AppleSoft Basic and assembly language and I fell in love with C and stayed on the comp.lang.c newsgroups.
Google, Faceebok and many others don't seem to agree with that statement.
Also, would your answer change if your company's goal was to develop better machine learning algorithms, or network technologies, etc.?
[1] https://qz.com/929275/you-probably-should-have-majored-in-co...
My point is... where would people get the education that bootstraps them to understand the state of the art then? To me that is the University's goal. In CS that means learning lots that may not be practical for a regular job (advanced algebra/calculus, computer architecture, data structure theory, etc.). However, in the long run this should leave you better prepared for the "boring jobs" too.
Now, you argue that this kind of education may not be the most efficient training process to regular job excellence? I totally agree. College as devised today is designed as the first step into eventually being able to contribute to the world's knowledge, or at least making good use of it. It is not devised as a way to prepare you for the job world, where immediate applicability trumps everything (in general).
I don't know the US system enough, but here in Spain (and at least in France and Germany) there are alternatives to College tuned to that goal. However, most parents (in Spain) still want their children to go the College route. Why? Because College is socially reputable (there are non-college educated leaders, but they are the exception, not the norm), and data shows that college educated people do have a higher expected income throughout their lives. It is percieved as a ladder up the social chain.
"If we seek guidance from the past, it is better to see the 'idea of the university' not as a fixed set of characteristics, but as a set of tensions, permanently present, but resolved differently according to time and place. Tensions between teaching and research, and between autonomy and accountability, most obviously. [...] between the transmission of established knowledge, and the search for original truth; between the inevitable connection of universities with the state and the centres of economic and social power, and the need to maintain critical distance; between reproducing the existing occupational structure, and renewing it from below by promoting social mobility; between serving the economy, and providing a space free from immediate utilitarian pressures; between teaching as the encouragement of open and critical attitudes, and society's expectation that universities will impart qualifications and skills. To come down too heavily on one side of these balances will usually mean that the aims of the university are being simplified and distorted."
[1] http://www.historyandpolicy.org/policy-papers/papers/the-ide...
[1] https://www.thebalance.com/what-is-average-income-in-usa-fam...
http://www.internationale-studierende.de/en/prepare_your_stu...
If college doesn’t give you real world skills and companies won’t train employees (https://www.washingtonpost.com/news/on-leadership/wp/2014/09...) where does that leave a college graduate?
We are seeing similar behavior with unpaid internships.
I have experience with FANG companies and most employees have huge gaps in social,life,cultural and historial experiences. When it comes to a Liberal Education, they skipped leg day.
Are you saying that new grads need to understand packer, docker, 3-way git merges and react?
There is no loyalty from any company. The days where there was an understood social contract between corporate America where they would take you in a train you and where you could work your way up the ranks and stay there for years is long gone. Corporate America is only interested in “increasing shareholder value”.
Since corporate America has no loyalty to you and will not train you - it’s your responsibility to train yourself and be ready to either jump ship for a better opportunity at the first chance you get or be ready to swim to the next opportunity when corporate America throws you off the boat.
The reality is that whether you believe that a college education is “a right” and that people shouldn’t have to go into tens of thousands of debt for a chance at a better life, American society disagrees. If you are investing tens of thousands of dollars for college, your reward can’t be just “being a better member of society”, it has to be - can I get a job to provide my own income, health care, retirement etc and have enough saved to provide my own safety net.
A liberal education if you are a software developer won’t help you achieve those goals.
Why is it so crazy that a college should teach you how to use source control? No matter what type of software development you are doing, you’re going to need it. What’s wrong with teaching you whichever is the most popular marketable front end MVC framework during your senior year so you can be productive on a job that’s not going to train you?
True you have to be a life long learner but six months after you graduate from college you’re going to have to start paying that student loan back and the way the government is trying to overturn the ACA, you’re not going to be able to stay on mommy and daddy’s health insurance after you get out of college - if they even have health insurance.
The former is for learning a job/role, the latter is for learning about a subject. The academic development in a subject/subjects may make you better for some jobs but that is not their primary purpose; you often need to add on your own extras if you want to be career ready.
I had no training and my university degree didn’t prepare me for it. While I already knew how to program, had played around with assembly on both my //e and later my Mac and taught myself C, and really only went to my little unknown state college for the piece of paper and not to learn, where would I have been if I had expected to actually learn something useful in college?
No one tells any other profession that they shouldn’t go to college expecting to get s job, why is CS different? Are you really going to say that most college students and parents spend tens of thousands of dollars on a college education just so they can be “a better member of society”?
Erm, isn't it your choice, study a subject or get a vocational qualification. I realise there's middle ground, they're the poles.
Why should we ruin universities just so businesses don't have to filter candidates, train recruits from a younger age, or have apprenticeships?
Seems better to use universities to expand human knowledge (individually and universally) than it does to use them as a hugely expensive way to do a first filter on company recruitment processes.
It’s not about should, it’s about reality. The corporations have already spoken. We can either accept reality for what it is or graduate a bunch of students with CS degrees that are saddled with debt that have a hard time finding a job. In the immortal words of Kosh, “Once the avalanche has started, the pebbles no longer have a vote”.
CS grads coming out of college are competing with foreign developers who were trained to get a job, have more experience and that will work for less.
and then you get employers saying they dont get skilled people.
That’s not the problem of academia.
They already do that. The fact that some people believe going in class and doing nothing on the side will suffice is the issue here, not academia itself.
My point is that academia must priorize theory over practice: 1- knowing the theory makes learning the practice easy, and not the other way around. 2- the theory is useful for your whole career. 3- Languages and frameworks evolve quickly, quicker than university courses [1].
[1]: In the university I was in they (re)define all courses every 3 years. That mean if you want to teach practice you must find something stable enough to be relevant for at the very least 3 years. They teach Java as a first language, Python for scripting; PHP for the Web; C for system stuff; OCaml then Scala as a functional language. As far as I remember it was roughly 80% theory 20% general practice (i.e. writing vanilla PHP instead of learning a Web framework).
My take was always that a strong theoretical understanding is what differentiates and engineering degree from a technical or trade degree that focuses more (or sometimes solely) on application and practical knowledge. In my mind, the ideal engineering degree focuses on the theory and provides just enough practical instruction to give you a starting point to begin applying what you’ve learned. I’m open to discussion on that though.
I am an engineer, with a PhD in physics. The theory had exactly zero use as soon as I quit academia.
Counter-example: I have a M.Sc in CS, with a specialization in programming languages. I know how to build a compiler, and it helps me almost every day. I’m not building a compiler every day, but the things I’ve learnt from compilers influence every piece of code I write. I can better optimize my code knowing how it’ll be compiled/interpreted by the machine.
In fact, I spent a lot of time at the university complaining I was learning useless stuff. Nowadays I’m super-grateful to my teachers for providing me all that knowledge I use every day, even if it’s not a direct application.
You are right in one sense though. Being good at engineering doesn't mean you have a good eye for design and good common sense for UX, but programmers are expected to more and more these days. This is why it's still important to get a well-rounded liberal arts education instead of going all-in on engineering and coming out with no creative/artistic ability.
I don't believe that OP's comment counts as focusing on business. To me, it's an effective way to engage students with a real-world use of the tech they are about to learn, thus establishing a baseline to gain perspective of how the academical part matters.
Otherwise you risk concentrating the course on a perspective taken from the top of the proverbial ivory tower that leads students to just go through the course without taking anything out of it.
For a single presentation, you do this by presenting some motivation and the surrounding space before diving in.
For courses, the best I've seen is to present the structure at the beginning, and continuously revisit that as the semester progresses. What's the purpose of the course? To build to a solution to X or understand problem space Y.
Most of the courses I have had have followed this structure, and whether I enjoyed the topic or not, it was engaging enough. Unfortunately, I've had a few courses by people who clearly didn't care and started the class by telling me why they are smart and I should follow them, then reading off slides prepared by the book author or whomever, without understanding the purpose or direction of the course themselves.
Contextualization can and should occur not just by need, as in where are we going with this, but also
Often times areas of Mathematics or Physics are presented in way that is completely disjoint from their history, that these n-pages of results actually took 50+ years are more to discover and argue over. That careers diverged and were ended over who was on what side.Too many concepts are communicated as a series of steps, do A, do B, do C ... but you have no idea that you are actually baking a cake. If it isn't a surprise, tell the other party the destination.
Or some kind of questions answers quiz in that html, simple exercises to train etc. Having simple problems to he solved by yourself works great for learning.
I think CS can be a dry topic and not everyone will enjoy it. I think adding some visualizations like the videos from 3Blue1Brown can be cool. It's sometimes hard to visualize how an algorithm works by reading it. https://www.youtube.com/channel/UCYO_jab_esuFRV4b17AJtAw
Best of luck
For pedagogy, if it needs to be interactive, it should just be source code that will be executed in whatever is the idiomatic manner for the underlying language or tool. (But very often, things don’t need to be interactive anyway, and only are shoehorned into it because it’s trendy.)
For example, the Scala extension to Jupyter is painful. Absolute hindrance to learning or teaching or working. Compared with just writing source in a powerful editor and then using sbt, it’s night and day.
I say this as someone who has spent many years working with IPython and Jupyter, including writing 0MQ kernels to use IPython with a company’s in-house language, and working on large data science and machine learning teams.
Thinking of notebooks as discrete units of sharable work, I think, is absolutely eroding many more sincere collaboration, pedagogy and reproducibility skills.
It reminds me in some ways of the early 00’s MATLAB fad, especially how The Mathworks targeted students to get them hooked on this one way of working (with MATLAB as IDE, interpreter, presentation tool, etc.) to create a pressure on employers to offer MATLAB as a standard working environment.
For "reproducibility" or "experimentation" in a production-like R&D environment or university lab, there is one set of downsides. For pedagogy there is another.
From a reproducibility point of view, notebooks are bad because you'll always need the underlying software you're writing to have good modularity anyway. One-off helper functions or any pieces of important business logic, etc., need to be factored out into separate packages or libraries that can be imported anywhere they are needed. "Hard coding" implementations into a notebook is very bad for this, because if you don't exercise an unrealistic degree of care, then certain cells or definitions will rely implicitly on values or imports from other cells, and the interdependencies are a mess to untangle if you are trying port the code from the notebook into a more modular form. Experience has shown me that you don't gain any boost in productivity or speed for experimentation or tinkering if you ignore this and try to make things more modular later on. You just end up writing really sloppy notebooks that have to function as standalone scripts, and you waste some other engineer's time who has to go back and undo the mess.
If you just start out developing in source files in the natural and idiomatic package / library approach of your underlying language, it gets you 90% of the way there for zero extra effort.
The other big thing is that regardless of whether you are writing experimental code to test an idea or a prototype, or you are writing production code, you should be using code review in both cases. Particularly in the experimental case, as in machine learning or statistics, many of the mistakes that make you go back and waste a lot of time are because of methodological errors or diagnostic errors that should have been reviewed by other researchers before you execute the experiment or prototype -- which means you want your code in a good format for simple code review tools, like PRs in GitHub or analyzing diffs. Notebook formats are notoriously bad for this, and since you can accomplish any of the same dev tasks without a notebook anyway, it's an argument against trying to shoehorn a code review process to use some extra type of tooling for analyzing code review artifacts directly from a notebook file.
Along the same lines, notebooks end up encouraging you to have a large block of imports that implicitly define your dependencies, including resources, settings, environment variables, local files, URL settings, etc. etc. This stuff should always be factored out into a maintainable settings artifact of some type that can also be version-controlled and reviewed.
So once you refactor any kind of reusable logical components, refactor any hard-coded settings, use proper dependency management, and put anything of any importance into source files that facilitate easier packaging / sharing / code review ... all you're left with in the notebook is shallow plotting code, which can just as easily be in a source file as well.
Once at that point, I don't think it matters if it's a notebook or not, and it would be fine to use notebooks as extremely shallow presentation tools that do nothing but import other source packages and produce plots / tables / etc. But again, if you've gone that far, there are better ways to produce the same plotting artifacts, etc., and to get away from reliance on the browser as the display medium, and to improve code review even of the plotting artifacts.
For pedagogy I think the problems are different. First you have to think about what is the goal? If the goal is to teach programming concepts, then you are better off teaching them in the idiomatic execution paradigm of whatever language you're using. So distribute source files and instructions to students, rather than isolated notebook cells. Consuming this stuff by looking at it through a web br...
A second advantage is that the students have a written record to study. This should help motivated students with the drive to learn the material. Without such a drive, nothing you do will make a difference.
A third benefit to this approach is the ability to add links to good explanations of difficult concepts in the notebook.
Not to insult Hacker News, but I think you can get A LOT more from the expert teacher community than the expert software engineering community.
Thanks for the pointers, I will check out those resources.
Observation 2: If you can prepare something detailed in writing in advance, it’s more efficient to just give it to the students in advance and let them read or view it on their own time.
Observation 3: Interactive discussions are the one thing that classrooms are optimized for.
Don’t stop the prep work. But if you can lead classroom discussions with safe cold calling, the students with get more out of it. Don’t worry about capturing the results. You could record it, but it’s the process of struggling and discussing that creates learning. Written artifacts are supplementary.
I commend you for both teaching, and for caring enough about your craft to ask for help. The Lifetime value your students can get is enormous.
The best way to do this is to try to identify the good part or motivation in a student's statement, regardless of anything wrong that might be in there too. Provide positive reinforcement on that part, and then turn the question back to the group again, with that extra foothold that the first student provided.
Example: Me: "If we wanted to look at every relationship between these objects pairs of these objects, how many relationships would we have?
Student A: "N squared!"
Me: "Sure that's a good start; there's N squared possible two-ples you can form. But I think you may be overcounting a bit; can anyone suggest a way to cut it down?"
Student B: "You don't need to pair objects with themselves."
Me: "Great; so how many are we at, then?
Student B: "N^2 - N".
Me: "Awesome; I feel like we can still cut it down more. Any more ideas? Anyone want to try a small example?"
etc etc...
---
Other bits of advice that come back to me with some writing:
* Provide seeds for ideas, and let the students fill out the flesh.
* Keep the conversation moving around the room. Try to engage a variety of voices.
* Provide at least some positive feedback for everyone who participates. Modulate for effect: eg, bigger praise for more complete, well communicated answers, or for people contributing for the first time.
* If the Super Student blurts out the final answer, take it back to the class and ask if anyone can explain it in more detail.
* Choose good questions. It's easy to ask a question that only you know the answer to... Mix up easy and hard questions, and use the easy questions as a way to 'onboard' quieter students.
Do it well, and there's always going to be enough hands to avoid cold calling. If I genuinely get no hands on a question, it generally means I've asked a bad question; rephrase and ask again. (And on day one, I have a dumb joke where I have everyone "raise your hand if you have a hand" and then do 'reverse' hand raising...)
Your example sounds very reasonable to me, but do you think that this is ever taken too far?
Coming to the US as a student from Europe (not the UK), I noticed that some instructors (mostly TAs) took this effort to give a "positive" response to any answer in class to quite an extreme. I can think of many instances where a student's answer showed a very serious lack of understanding, and the instructor would say something like "okay, that would be one way to think about it, but how about... " without every correcting the student.
Two negative consequences I saw were 1) a lot of missed opportunities for correcting students' misunderstandings 2) students seemed overly sensitive to any kind criticism (I had a German friend who was a TA and had quite a bit of trouble with this)
Again, none of this is incompatible with your advice, I just wanted to take the opportunity to see if anyone has noticed this as a common problem.
The trick is telling them they're wrong without making it sound like you are calling them stupid.
My question in the 'serious misunderstanding' realm would be whether this is a problem that this individual student is having, or is it a common misunderstanding across the class? In the latter case, I turn the question back out to the class, eg, "Who thinks that's the right answer, who thinks it's Something Else?" And then we demonstrate the the individual student isn't alone in the Serious Misunderstanding, and provide a bit of personal buffer between the response and the correction.
I want students to come away with a self-description of "I have lots of ideas, and they need to be carefully checked because sometimes they're wrong," as opposed to the incredibly prevalent "I'm bad at math."
1. Before class, we were assigned to read a chapter from the textbook, understand the material, and complete two or three homework problems from the material we had just self-learned.
2. After submitting homework, lectures focused on discussing the concepts more in-depth. Everybody already had a baseline knowledge, so the professor would highlight the important takeaways, applications, live demonstrations of concepts, etc. I found these lectures engaging because I had already learned the material - and the lectures focused on mastering it.
3. Sometimes there would be follow-up homework problems focusing on advanced applications or derivations. These advanced problems were closest to exam questions.
Some takeaways for me:
- If we didn't have homework to do before class, I doubt I would have consistently learned the material before lecture.
- Lectures taught us more than the "what" - it taught us the "why" and how these concepts related to other areas.
- Lectures focused on answering questions, exploring curiosities (like "what if" questions), demonstrations/experiments, and mastery. The professor added value beyond the written material!
I hope this helps OP because it sounds like they have material prepared beforehand, which means that the lectures could go beyond the material.
I took part in an online course where you had to answer 3/5 quick questions correctly before you were admitted to the lecture room.
I think it resulted in an engaged and knowledgeable class.
I've also taken a course where you can't proceed to the next lecture unless you get more than 70% grade on homework from the previous lecture (which you could submit multiple times but it was not multiple choice). This also worked really well.
Grade the students on this?
Ultimately, it is of course the responsibility of the student to decide what they want to do. If you don't want to learn, see learning as a side-job, or live in an environment that does not leave room for learning outside of college hours, then you might be in more generic trouble anyway ;-)
Prepare an evaluation form at the end of the class to have a better assessment of your class from the students. Write the questions such that you can get constructive feedback from them.
Try to balance the boring stuff you can avoid with more engaging material. Break the pace with questions or exercises.
If you can, do a lot of labs to "gamify" your class. Programming/hacking can be fun and addictive so it's a great opportunity to make students happy and learning something at the same time. However, it takes time to write good labs.
I noticed that no matter the content, students are satisfied if the difficulty is adequate.
1) What should I keep doing? 2) What should I stop doing? 3) What should I start doing?
The goal here is not detailed feedback, but a high response rate that will give you enough data to course correct.
I recently graduated from a top tier CS school that emphasizes systems programming (C/C++, OS concepts, embedded systems, etc) and found that the overwhelming majority of learning happens when working through implementations and actually writing code (10+ hrs/week). Lectures (2-3 hrs/week) are really just a supplemental overview of concepts, the quality of a course is largely a function of the quality/rigor of the projects – the exception may be courses for students new to CS, who need lectures to understand fundamentals.
Well designed projects with detailed writeups, built-in tests, and live scoreboards created an effective curriculum. As did factoring program performance (runtime, memory utilization, cycle count, etc) into the grade (in addition to correctness).
Really appreciate your willingness to take feedback and your desire to improve, especially given that you already have a wealth of experience. Your students are lucky to have you! Best of luck.
Interactive activities are great! Do be aware that even with a very interactive activity there may be lots of students who are not actively participating. Two or three students who loudly share their opinions can easily make you forget about the silent majority.
Don't worry too much about capturing the interactive parts and demonstrations. The key thing is they are unique enough to stick in people's memory. I still remember demos from my college days and the basic principles they were espousing, even if the technical jargon and equations are now long gone.
I personally had very different opinions about my university courses even 1-2 years after graduation vs. right at the time of taking them. Wish there was some more systematic way of collecting that kind of student feedback with a little more hindsight.
* Making the lectures available in an accessible format (I have a slight preference for PDF, but HTML is just fine too) is a huge benefit. Before exams I like to aggregate all of the lecture materials to date into a single monolithic document so I can ctrl+f the whole thing while studying. If you have a proper hierarchy / table of contents this is even easier.
* Learning from a book / lecture along is really hard. It’s important to not just show examples, but show me how I can run the examples on my computer myself. Something I can interact with live, tweak, play with, add code to is hugely useful for building understanding.
* Don’t assume that I understand the boilerplate, tools, and so on. I’ve had a lot of professors who explain the core material well, but not how to actually open up a text editor / IDE, write code, compile it, and run it. I had already been using UNIX for years before starting college so this didn’t affect me that much, but tooling is one of the #1 issues I see my peers (and the students in courses I TA) struggle with.
* Use lecture to explain concepts, not code as much as possible. If you show me code in lecture I’m probably not going to remember it well enough or write it down in my notes well enough to replicate your example if it’s at all non trivial. Instead, make video/HTML/PDF tutorials that walk the student through the code example. If you want to show a code example in lecture, walk through one of those tutorials in lecture! Make sure these tutorials explain how to go from sitting at my desktop with nothing open to writing code and having it run, especially early in the course. See [1] and [2] as concrete examples. If you spontaneously come up with a cool demo or something, go for it, but try to record your screen / terminal, and if it you can’t get it working, move on quickly. When I TAed my institution’s intro to UNIX systems class, I kept a terminal open on the projector at all times with a `script` session running. I would upload the transcript after each lab sessions so the students could reference it.
* If it is possible, set aside scheduled time for the students to be in a computer lab working on assignments that you or a TA will be there to help them if they have questions. It can be hard to articulate code problems during lecture or in office hours without being in front of a computer with an IDE/editor open. If you have large class sections this may not be a viable option though.
* For assignments and homework, include a clear list of deliverables which the student should turn in. For example “I want a zip file where /myprog.c implements the API described on page X of the homework 3 assignment sheet” and so on.
* If you want students to do something, attach a grade to it. In my experience, ungraded exercises usually result in the exercises remaining undone by the majority of the class.
* Provide a reference library on your course site of functioning code examples, each with a README explaining how to run it, what it does, and so on. Ideally try to demonstrate one concept per sample. This will both provide students with working examples to learn from, as well as be a valuable resource when you get asked questions in lecture and need to demonstrate a particular function call or technique off the cuff.
* Something that one of my past professors did which I found very valuable was to have an "A" and a "B" version of each assignment. Essentially the "A" version would be "get it to compile and implement some trivial facet of the assignment", and the "B" version would be "implement everything in the assignment sheet". The A version would always be due a few days after the assignment was posted, and the B version a week or two later. The A version would be worth like 10% of the ass...
I always found lectures more engaging when they provided something more than the essential course content. Demos and live examples can work well but they can end up being rather lengthy which can be a bad thing. Reading through slides or course notes that are available anyway doesn't really help.
As I mentioned elsewhere on this thread, discussion was in my experience a mixed bag. Some lecturers tried to get discussion or class participation by asking specific people at random, I think this caused people to just avoid these lectures for fear of being picked. On the other hand, just asking questions can result in a long silence before anyone decides to answer, perhaps this is a thing more in the UK, I'm not honestly sure. It certainly can work and it's definitely better with smaller groups.
I found practical assignments were better when they felt less synthetic, it's much easier to motivate to learn for something when the task seems more authentic. For theory, it's always good to have the opportunity to ask questions if given homework, my lecturers were varied in this regard. Questions in lectures can work but some will be reluctant to ask in case it's a "silly" question. My university ran labs with TAs for most units with a practical element, I think these were a better environment as it meant that you didn't have to announce your question in front of everyone else. We had tutorials for some more theory heavy units which provided the same facility.
So much this.
When I was doing organic chem back in the day, I found a lab textbook that pitched each lab specifically in the context of "You are an [petroleum engineer] hired to analyze whether this sample of [whatever] contains [something]," and built up a whole - surprisingly detailed - business context for what you were doing, and why you were doing it that way. It was like OChem: the RPG. It made the actual assignment feel engaging and useful - like leveling up - rather than being a random hoop to jump through because someone somewhere decided this was something that needed learning.
Feeling useless is one of the worst things in the world. Grounding things in reality, building things in the context of what you'd actually utilize it for, is amazing. I wish every class did.
1. Classes where the content is better presented on Youtube, so I don't go to class and just watch the youtube videos on it. There are some really great Youtube videos on a lot of CS content, so it might even make sense to assign that to students so you aren't wasting your time re-explaining basic content that's already well documented.
2. Classes where the content is highly interactive, and most of the class is us digging into a topic together as a class.
I think the most interesting classes are the ones where the teacher just asks questions, and then only provides answers when the class is stuck. I think it'd be a good exercise to ponder how you could structure your classes such that you only ask questions. You may find that it's easier when they present a guess or 2 at an answer, and then you help out with any logical jumps necessary, or show them how specifically it works in a particular database.
I think there's a tipping point with asking questions in class—if you ask too few, students aren't really in their "question answering" mode, and they won't want to interact. But if you ask enough, there will always be at least a few students offering ideas. It also helps to have many softball questions, especially in the beginning, so students who might not be following as closely can still hop in.
It also might help for the students to review some material before class to be ready for it.
Best of luck!
Whatever the difficulty in recording though, I really would encourage you to keep that format, as it's much more engaging and also educational than a lecture. When someone in class poses a question and others answer, that causes a natural segue into a thinking and questioning process in every student that otherwise requires a laser-focus and also reasoning while also listening to material.
I'll second philip1209's comment elsewhere in this thread though, during my undergrad and my master's, my favourite classes were always very discussion heavy. Some of them required reading up ahead and a menial task to make sure you actually did it e.g. read a paper or a chapter, then summarize it in half a page to a page and submit online. Then the rest of the class is mostly q and a where the professor steers the agenda. In graduate level ones sometimes the students had to present each class and then everyone discusses during.
One thing that discourages teachers often is that it's difficult to get students to say anything. Believe me that this changes quickly if it's nurtured. One prof had a goofy question mark face symbol and explicitly said he expected a discussion whenever you saw that logo when he was teaching. The first few times he had to sit and awkwardly wait for a whole minute or two before someone said a word - like a game of awkwardness chicken, where someone eventually can't take it anymore and blurts out something, which is exactly what you want, so you can build the discussion on that. Once someone says something the ball gets rolling. He also did a thing where he'd gradually simplify the question every time no one answered ("ok well how would this work if you didn't have to worry about ..."), to the point where often the question would be something self-evident that was hard to not answer. Another tactic was to never shame a "silly" answer but to pull out a good bit about it and use it to direct the next question.
One thing that probably helped was that these were often graduate or junior/senior level classes, so people had mostly chosen to be there. Another thing was that the premise of the class was that it was mostly discussion based with some presenting in the middle, which works a lot better than mostly presenting with a tiny bit of discussion, because of the overhead of effort of getting the ball rolling in a discussion environment. Finally, there was a no laptops or phones rule made very clear during class selection period, which really did do wonders. The justification was "we tried it a million times and it just doesn't work" - apparently it's really hard to maintain attention for an hour and a half when distraction is a glance away, and you don't want to miss anything or it's easy to get left behind.
- what is our problem (queries are slow) - why do we have this problem (scanning the whole table takes a lot of I/O which is expensive) - how can we solve this problem (indexes help know where content is so you can do less I/O) - demo of it - when does this not work (when your indexes aren't selective, sometimes they can be slower than just a scan, or when it's hurting insertion speed)
etc etc.
Even if you mentioned what we were trying to do once in the beginning of the class (or worse, beginning of the semester), it helps a lot to go back and keep referring to it every time you introduce some new thing just so we know how this new little tidbit helps with the original issue.
Re: some of the other commenters' suggestions, you might want to research the "flipped classroom", which is the popular term for the model they're discussing (students read materials pre-lecture, and lecture time is re-purposed for discussion and engagement activities).
I would add that they can also come in and observe and confidentially give you input.
Not just flipped classroom...which some students find annoying / 'cheating' ...look at active learning as well.
Honestly - if a student thinks your class is dry they are not going to make it to 10 years of experience to get to the actual work.
I really the prepare ahead type of course layout. It gives me the chance to read through, maybe code up a couple of examples and come to class with questions. It also seems like that format of class leads to more interesting discussions on how concepts can be used.
Another thing that I've come to appreciate in University courses is a professor who was in the industry for a while. One professor in particular had a lot of stories about his time at IBM, talked about perspectives on building large systems in teams, thoughts on how to deal with management as well as the actual concepts. It's very neat to hear about what practicing computer science looks like off campus.
It seems like you're missing a worried here.
Are you perhaps not sufficiently conveying your interest in the topics to the students?